XML Attribute Namepsace (xmlns)



  • Hallo Leute,

    ich möchte gerne einem XML Tag ein "xmln" Attribute zu einem XML Tag hinzufügen,
    dabei hab ich etwas schwierigkeiten, da ich keine "standard" xml namespaces erstellen kann:

    Code:

    var attribA = new XAttribute(XNamespace.Xmlns + "lv", "http://www.ni.com/LVData");
    var attribB = new XAttribute("xmlns", "http://www.ni.com/LVData");
    var root = new XElement("LVData", attribA);
    

    Mit der "attribA" Variante kommt dies hier raus

    <LVData xmlns:lv="http://www.ni.com/LVData"/>
    

    Ich möchte aber das "lv" deklaration weg haben, und nur "xmlns", deswegen wollte ioch "attribB" verwendet, was aber beim speicher des xml dokuments zu folgender exception führt :

    Das Präfix '' kann nicht von '' in 'http://www.ni.com/LVData' innerhalb desselben Startelementtags neu definiert werden.

    gibt es keine möglichkeit das hinzukriegen, google half mir bisher nich weiter.

    Guten Morgen;)



  • Probier mal folgendes:

    Namespace ns = "http://www.abc.com";
    XDocument xDoc = new XDocument(
        new XElement(ns + "root", 
            new Element(ns + "foo")));
    

    Wichtig hier ist die Syntax: new XElement(ns + "root");
    Du musst für jedes Element den Namespace + den Elementnamen angeben.
    So erzeugst du dann folgendes:

    <root xmlns="http://www.abc.com">
        <foo xmlns="http://www.abc.com"></foo>
    </root>
    


  • Hi, danke für die Hilfe, jetzt sieht es chon bisschen besser aus. Allerdings soll der xmlns namespace nur im "root" vorkommen, und nich mehr in den untergeordneten elementen "foo"



  • Ich denke, ich habe ein ähnliches Problem:
    Ich möchte eine XML-Datei erstellen mit folgendem Tag und Attributen:

    <gpx creator="Geocaching++" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd 
    http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1
    http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd
    http://www.garmin.com/xmlschemas/ActivityExtension/v1 http://www8.garmin.com/xmlschemas/ActivityExtensionv1.xsd http://www.garmin.com/xmlschemas/AdventuresExtensions/v1
    http://www8.garmin.com/xmlschemas/AdventuresExtensionv1.xsd http://www.garmin.com/xmlschemas/PressureExtension/v1
    http://www.garmin.com/xmlschemas/PressureExtensionv1.xsd" xmlns="http://www.topografix.com/GPX/1/1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1"
    xmlns:gpxtrx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"
    xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
    xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"
    xmlns:trp="http://www.garmin.com/xmlschemas/TripExtensions/v1"
    xmlns:adv="http://www.garmin.com/xmlschemas/AdventuresExtensions/v1"
    xmlns:prs="http://www.garmin.com/xmlschemas/PressureExtension/v1">
    

    Wenn ich nun folgenden C#-Code ausführe:

    XNamespace xmlns = "http://www.topografix.com/GPX/1/1";
    XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
    XDocument test = new XDocument
    (
           new XDeclaration("1.0", "utf-8", null),
           new XElement(xmlns + "gpx",
                  new XAttribute("creator", "Geocaching++"),
                  new XAttribute("version", "1.1"),
                  new XAttribute("xmlns", "http://www.topografix.com/GPX/1/1"),
                  new XAttribute(xsi + "schemaLocation", "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd
    http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd
    http://www.garmin.com/xmlschemas/ActivityExtension/v1 http://www8.garmin.com/xmlschemas/ActivityExtensionv1.xsd http://www.garmin.com/xmlschemas/AdventuresExtensions/v1
    http://www8.garmin.com/xmlschemas/AdventuresExtensionv1.xsd http://www.garmin.com/xmlschemas/PressureExtension/v1 http://www.garmin.com/xmlschemas/PressureExtensionv1.xsd"),
                  new XAttribute(xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
                  new XAttribute(xmlns + "wptx1", "http://www.garmin.com/xmlschemas/WaypointExtension/v1"),
                  new XAttribute(xmlns + "gpxtrx", "http://www.garmin.com/xmlschemas/GpxExtensions/v3"),
                  new XAttribute(xmlns + "gpxtpx", "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"),
                  new XAttribute(xmlns + "gpxx", "http://www.garmin.com/xmlschemas/GpxExtensions/v3"),
                  new XAttribute(xmlns + "trp", "http://www.garmin.com/xmlschemas/TripExtensions/v1"),
                  new XAttribute(xmlns + "adv", "http://www.garmin.com/xmlschemas/AdventuresExtensions/v1"),
                  new XAttribute(xmlns + "prs", "http://www.garmin.com/xmlschemas/PressureExtension/v1"),
    [...]
    

    bringt er mir folgendes:

    <gpx creator="Geocaching++" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" p1:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1
    http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd
    http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/ActivityExtension/v1 http://www8.garmin.com/xmlschemas/ActivityExtensionv1.xsd http://www.garmin.com/xmlschemas/AdventuresExtensions/v1
    http://www8.garmin.com/xmlschemas/AdventuresExtensionv1.xsd http://www.garmin.com/xmlschemas/PressureExtension/v1 http://www.garmin.com/xmlschemas/PressureExtensionv1.xsd"
    p2:xsi="http://www.w3.org/2001/XMLSchema-instance"
    p2:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1"
    p2:gpxtrx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"
    p2:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1"
    p2:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"
    p2:trp="http://www.garmin.com/xmlschemas/TripExtensions/v1"
    p2:adv="http://www.garmin.com/xmlschemas/AdventuresExtensions/v1"
    p2:prs="http://www.garmin.com/xmlschemas/PressureExtension/v1"
    xmlns:p2="http://www.topografix.com/GPX/1/1"
    xmlns:p1="http://www.w3.org/2001/XMLSchema-instance">
    

    Außerdem wird in den "Unter-Tags" ebenfalls nun immer xmlns angegeben, mit xmlns="".

    Was mache ich falsch?

    LG, Ialokim



  • Hallo,

    die xmlns-Attribute mit XNamespace.Xmlns erzeugen:

    new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
                  new XAttribute(XNamespace.Xmlns + "wptx1", "http://www.garmin.com/xmlschemas/WaypointExtension/v1"),
                  new XAttribute(XNamespace.Xmlns + "gpxtrx", "http://www.garmin.com/xmlschemas/GpxExtensions/v3"),
                  new XAttribute(XNamespace.Xmlns + "gpxtpx", "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"),
                  new XAttribute(XNamespace.Xmlns + "gpxx", "http://www.garmin.com/xmlschemas/GpxExtensions/v3"),
                  new XAttribute(XNamespace.Xmlns + "trp", "http://www.garmin.com/xmlschemas/TripExtensions/v1"),
                  new XAttribute(XNamespace.Xmlns + "adv", "http://www.garmin.com/xmlschemas/AdventuresExtensions/v1"),
                  new XAttribute(XNamespace.Xmlns + "prs", "http://www.garmin.com/xmlschemas/PressureExtension/v1"),
    

    MfG,

    Probe-Nutzer



  • Vielen Dank, das funzt jetzt soweit... Allerdings kriege ich folgende Fehlermeldung,

    Das Präfix '' kann nicht von '' in 'http://www.groundspeak.com/cache/1/0' innerhalb desselben Startelementtags neu definiert werden.

    wenn ich folgenden Code habe:

    XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
                XNamespace xmlns = "http://www.topografix.com/GPX/1/1";
                XDocument test = new XDocument
                (
                    new XDeclaration("1.0", "utf-8", null),
                    new XElement(xmlns + "gpx",
                        new XAttribute("creator", "Geocaching++"),
                        new XAttribute("version", "1.1"),
                        //new XAttribute("xmlns", "http://www.topografix.com/GPX/1/1"),
                        new XAttribute(xsi + "schemaLocation", "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/ActivityExtension/v1 http://www8.garmin.com/xmlschemas/ActivityExtensionv1.xsd http://www.garmin.com/xmlschemas/AdventuresExtensions/v1 http://www8.garmin.com/xmlschemas/AdventuresExtensionv1.xsd http://www.garmin.com/xmlschemas/PressureExtension/v1 http://www.garmin.com/xmlschemas/PressureExtensionv1.xsd"),
                        new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
                        new XAttribute(XNamespace.Xmlns + "wptx1", "http://www.garmin.com/xmlschemas/WaypointExtension/v1"),
                        new XAttribute(XNamespace.Xmlns + "gpxtrx", "http://www.garmin.com/xmlschemas/GpxExtensions/v3"),
                        new XAttribute(XNamespace.Xmlns + "gpxtpx", "http://www.garmin.com/xmlschemas/TrackPointExtension/v1"),
                        new XAttribute(XNamespace.Xmlns + "gpxx", "http://www.garmin.com/xmlschemas/GpxExtensions/v3"),
                        new XAttribute(XNamespace.Xmlns + "trp", "http://www.garmin.com/xmlschemas/TripExtensions/v1"),
                        new XAttribute(XNamespace.Xmlns + "adv", "http://www.garmin.com/xmlschemas/AdventuresExtensions/v1"),
                        new XAttribute(XNamespace.Xmlns + "prs", "http://www.garmin.com/xmlschemas/PressureExtension/v1"),
    
    [...]
    
                new XElement("extensions",
                                new XElement("cache",
                                    new XAttribute("archived", "True"),
                                    new XAttribute("available", "True"),
                                    new XAttribute("id", "0000"),
                                    new XAttribute("xmlns", "http://www.groundspeak.com/cache/1/0")
    
    [...]
    

    Wo sitzt diesmal wieder der Fehler? Oder geht das wirklich nicht?

    LG, Ialokim



  • Wahrscheinlich willst du das hier:

    new XElement(xmlns + "extensions",
                                new XElement(xmlns2 + "cache",
                                    new XAttribute("archived", "True"),
                                    new XAttribute("available", "True"),
                                    new XAttribute("id", "0000")
    

    Dafür musst du also "xmlns + " vor "extensions" platzieren, damit kein xmlns="" erscheint, außerdem einen neuen Namespace definieren:

    XNamespace xmlns2 = "http://www.groundspeak.com/cache/1/0";
    

    damit du ihn hier:

    new XElement(xmlns2 + "cache",
    

    für das cache-Element nutzen kannst.

    Ergebnis:

    <gpx creator="Geocaching++" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/ActivityExtension/v1 http://www8.garmin.com/xmlschemas/ActivityExtensionv1.xsd http://www.garmin.com/xmlschemas/AdventuresExtensions/v1 http://www8.garmin.com/xmlschemas/AdventuresExtensionv1.xsd http://www.garmin.com/xmlschemas/PressureExtension/v1 http://www.garmin.com/xmlschemas/PressureExtensionv1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1" xmlns:gpxtrx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:trp="http://www.garmin.com/xmlschemas/TripExtensions/v1" xmlns:adv="http://www.garmin.com/xmlschemas/AdventuresExtensions/v1" xmlns:prs="http://www.garmin.com/xmlschemas/PressureExtension/v1" xmlns="http://www.topografix.com/GPX/1/1">
    <extensions>
      <cache archived="True" available="True" id="0000" xmlns="http://www.groundspeak.com/cache/1/0" /> 
    </extensions>
    </gpx>
    

    MfG,

    Probe-Nutzer



  • Soo, vielen Dank, jz hat das alles prima geklappt!

    Vielen Dank für deine Mühe, Probe-Nutzer! 😃

    LG, Ialokim



  • Soo, wieder mal habe ich ein Problem...
    Es hat zwar nicht direkt was mit Namespaces zu tun, aber doch mit XML.

    Folgendes: Ich möchte ein XML-Dokument erstellen, in dem das Element "log" 25-mal vorkommt. Nun habe ich alle "Ober-Elemente" erstellt und möchte die "log"-Elemente in einer Extra-Prozedur mit einer for-Schleife einbauen. Leider klappt das nicht so einfach wie gewünscht; beim Ausführen gibt es den berühmten "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt". Wo liegt mein Fehler?

    new XElement(xmlns + "extensions",
        new XElement(xmlns2 + "cache",
            [...]
            new XElement(xmlns2 + "logs")));
    for (int i = 0; i < 25; i++)
    {
        test.Element("logs").Add(
            new XElement(xmlns2 + "log",
                new XAttribute("id", cachedetails.logid[i]),
            new XElement(xmlns2 + "date", cachedetails.logvisited[i]),
            new XElement(xmlns2 + "type", cachedetails.logtype[i]),
            new XElement(xmlns2 + "finder", cachedetails.loggingusername[i],
                new XAttribute("id", cachedetails.logginguserid[i])),
            new XElement(xmlns2 + "text", cachedetails.logtext[i],
                new XAttribute("encoded", cachedetails.logisencoded[i])),
            new XElement(xmlns2 + "log_wpt",
                new XAttribute("lat", cachedetails.loglatitude[i]),
                new XAttribute("lon", cachedetails.loglongitude[i]))));
    }
    

    LG, Ialokim

    EDIT: test ist der Name meines XDokuments 😉



  • Hi,

    bei welcher Zeile hält denn dein Debugger an? Da kannst du normalerweise recht schnell sehen welches Objekt wirklich null ist, das kann man aus dem gegebenen Codefragment nicht erkennen. Wahrscheinlich ist dein Array von z.B. logid oder logvisited nicht 25 Elemente groß?! Ansonsten poste mal etwas mehr Code mit dem man den Fehler nachvollziehen kann, optimalerweise ein minimales ausführbares Programm.

    mfG
    KaPtainCugel



  • Hallo KPC,

    das Problem ist, dass vom Debugger das Ganze:

    test.Element("logs").Add(
        new XElement(xmlns2 + "log",
            new XAttribute("id", cachedetails.logid[i]),
        new XElement(xmlns2 + "date", cachedetails.logvisited[i]),
        new XElement(xmlns2 + "type", cachedetails.logtype[i]),
        new XElement(xmlns2 + "finder", cachedetails.loggingusername[i],
            new XAttribute("id", cachedetails.logginguserid[i])),
        new XElement(xmlns2 + "text", cachedetails.logtext[i],
            new XAttribute("encoded", cachedetails.logisencoded[i])),
        new XElement(xmlns2 + "log_wpt",
            new XAttribute("lat", cachedetails.loglatitude[i]),
            new XAttribute("lon", cachedetails.loglongitude[i]))));
    

    nur als eine Codezeile angesehen wird. Daher kann ich nicht sagen, an welchem Objekt es jetzt genau liegen könnte, aber an den Arrays kanns nicht liegen: Alle sind genau 25 Elemente groß und außerdem zeigt er den Fehler schon beim ersten Durchlauf der Schleife, d.h. wenn i = 0 ist.
    Für mich sieht es am ehesten so aus, dass er das Element "logs" nicht finden kann, obwohl es ja vorher initialisiert wurde. Oder muss es etwa irgendwelche Unterelemente geben, damit das Element erkannt wird?
    Es könnte möglicherweise auch an dem Namespace liegen, dass ich vorher definiert hatte (xmlns2), dass er deswegen das Element nicht findet...

    LG, Ialokim

    EDIT: Es klappt nun doch! Es lag wirklich an den Namespaces und daran, dass ich alle Ober-Elemente angeben musste 😃


Anmelden zum Antworten