Laden...

XML Element mit namespace erstellen?

Erstellt von Seikilos vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.302 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 15 Jahren
XML Element mit namespace erstellen?

Ich versuche die folgende Zeile mittles C# zu generieren:


<ab:eXML xmlns:ab="http://domain.de" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="">

Mein Code sieht bis jetzt so aus:


writer.WriteStartElement("ab", "eXML", @"http://domain.de");

liefert mir ->


<ab:eXML xmlns:ab="http://domain.de">

Was ok ist, aber ich finde keinen weg, wie ich noch xmlns:xsi und xsi:schemaLocation in dieses Element integrieren kann, mein Versuch war:


writer.WriteStartElement("ab", "eXML", @"http://domain.de");
                // XSI

                writer.WriteStartAttribute("ab", "xsi", @"http://www.w3.org/2001/XMLSchema-instance");
                writer.WriteEndAttribute();

Doch daraus wird nicht das generiert, ewas ich brauche, nämlich

<ab:eXML p1:xsi="" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance" xmlns:ab="http://domain.de">

(Ich vermute, dass diese Attribute nicht so einfach erstellt werden können?)

Life is a short

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo Seikilos,

bei XML's mit Namespaces verwende bitte den "XmlNamespaceManager", damit lassen sich dann solche Verweise veralten und bei einem CreateElement gibst Du nur den Präfix an, und er fügt in aller Regel die Namespace-Uris automatisch hinzu.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 15 Jahren

Hier ist doch der namespace nicht das Problem, oder?

Es geht mir um die Einträge xmlns:xsi und xsi:Schemalocation, die krieg ich ja nicht geschrieben

Life is a short

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo Seikilos,

jain, der namespace ist nicht wirklich ein Proplem, eher das Präfix, der gehört aber zu Namespaces 😉

Egal, wie auch immer, schau mal was ich hier gefunden hab:
Verzweifle beim XML Document erstellen...

Der letzte Beitrag sollte eigentlich Dein Problem lösen, oder?

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 15 Jahren

Stimmt, scheint das gleiche Problem zu sein, danke 🙂

Life is a short

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 15 Jahren

Wobei ich keinen Ansatzpunkt für den XMLNamespacemanager für den XMLWriter finden kann.

Life is a short

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo Seikilos,

hier ist die Frage, ob Du zwingend den XmlWriter für diesen Anwendungsbereich weiter verwenden willst, oder ob Du nicht auf XML DOM umsteigst, denn dann wäre der Beitrag von tmanthey Deine Lösung.

Wenn Du zwingen den XmlWriter benötigst, dann kannst Du in der Tat den XmlNamespaceManager nicht verwenden.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 15 Jahren

XML DOM ist XMLDocument?

In der Help steht unter XML Dom viel, und viele Klassen werden aufgeführt, wie XMLNode, XMLElement usw, aber gibt es da eine Manager Klasse für? Sonst ist ja die Verwaltung dieser Klassen nicht so geschickt

Life is a short

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo Seikilos,

XML DOM ist XMLDocument?

ich würde es anders herum formulieren:
XmlDocument hat als interne Funktionsweise den DOM Parser am Start. Der XmlWriter ist da eher "Stream" basiert, wenn ich da nicht falsch liege ist das der SAX Parser.

Nähere Infos hierfür z.B. hier:
UziWeb - XmlParser

Je nach Parser, der dann hintendransteht ist die Herangehensweise für XML different. Was beim Vergleich "Stream" und "nicht-Stream" basiert am ehesten hinhaut:
Bei einem Stream ist die zugrundelegende Struktur im Xml-Dokument nicht bekannt (man weiß ja nie was noch kommen wird), während beim "Nicht-Stream" zunächst das gesamte XML-Dokument eingelesen und analysiert wird.

Deshalb funktioniert beim DOM Prinzip auch automatisch XPath, bei einem Streaming-Prinzip muss man das erst nachimplementieren.

So funktioniert auch der NamespaceManager nur mit einem DOM (XmlDocument), da er hier jedem zugehörigen Knoten auch dann ein Präfix vergeben kann und das auch nachträglich, wenn schon XML Struktur vorliegt.

Vor- und Nachteile der einzelnen Herangehensweise sollte auch automatisch klar sein:
XmlWriter -> Schneller im Einlesen, weil Streambasiert, langsamer bei Strukturabfragen, sehr umständlich beim Einfügen von Xml-Knoten innerhalb eines bestehenden Dokumentes, Rekursives suchen sehr langsam
XmlDocument -> viel langsamer beim Einlesen (vor allem bei großen Xml-Dokumenten eine Speicherfrage), höchster Komfort beim Bearbeiten und Suchen von Knoten und Inhalten

Ich hoffe ich konnte etwas XML Grundkenntnisse näher bringen und die zugrunde liegende Architektur aufzeigen?

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 15 Jahren

Ich kappiere eine Sache nicht, die mir nicht durch das manual ersichtlich geworden ist:

 XmlDocument doc = new XmlDocument();
    doc.LoadXml("<book genre='novel' ISBN='1-861001-57-5'>" +
                "<title>Pride And Prejudice</title>" +
                "</book>");

    //Create an attribute.
    XmlAttribute attr = doc.CreateAttribute("publisher");
    attr.Value = "WorldWide Publishing";

    //Add the new node to the document. 
    doc.DocumentElement.SetAttributeNode(attr);

Wenn ich doc.CreateAttribute schreibe, so bekomme ich ein XmlAttribute undmuss es dennoch noch irgendwo in doc plazieren. Wieso? Wäe CreateAttrubute nicht besser als static? Oder was verstehe ich da nicht?

Life is a short

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo Seikolos,

so 100%ig ganz habe ich das bis dato auch nie verstanden. Eventuell könnten die Namespaces hier ein Thema sein, da nur zur Erstellungszeit des Knotens/Attributes mit Hilfe des bestehenden Dokumentes bekannt ist welche Namespaceattribute gesetzt werden.

Aber wie gesagt 100%ig klar ist mir das auch nicht.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”