Benutzer mit den meisten Antworten
XmlNode.InnerXml ohne Namespace-Ergänzungen

Frage
-
Hallo,
ich habe ein in einer XSD Datei beschriebenes XML-Format und erzeuge ein neues XML-Dokument, welches für dieses Beispiel so aussehen soll:
<?xml version="1.0" standalone="yes"?> <MyXML xmlns="http://tempuri.org/MyXML.xsd"> <Node1> <SubValue1>1</SubValue> <SubValue2>2</SubValue2> </Node1> <Node2> <Sub>123</Sub> </Node2> </MyXML>
Aus diesem Xml möchte ich den Text, welcher den Node1 beschreibt herausziehen, es sollte also ein string mit folgendem Inhalt dabei herauskommen:
<Node1> <SubValue1>1</SubValue> <SubValue2>2</SubValue2> </Node1>
Leider komme ich da zunächst nicht hin, weil ich statt dem oben beschriebenen bei Node1 eine Angabe mit "xmlns..." habe.
Der Code hierzu sieht so aus:
MyXML myXMLwithSomeInfo = new MyXML(); var rowNode1 = myXMLwithSomeInfo.Node1.NewNode1Row(); rowNode1.SubValue1 = "1"; rowNode1.SubValue1 = "2"; myXMLwithSomeInfo.Node1.Rows.Add(rowNode1); XmlDocument doc = new XmlDocument(); XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(doc.NameTable); xmlnsManager.AddNamespace("MyXML", "http://tempuri.org/MyXML.xsd"); string str = myXMLwithSomeInfo.GetXml(); // str enthält hiernach: //<MyXML xmlns="http://tempuri.org/MyXML.xsd"> // <Node1> // <SubValue1>1</SubValue> // <SubValue2>2</SubValue2> // </Node1> // <Node2> // <Sub>123</Sub> // </Node2> //</MyXML> doc.LoadXml(myXMLwithSomeInfo.GetXml()); XmlElement root = doc.DocumentElement; XmlNode node = root.SelectSingleNode("//MyXML:Node1", xmlnsManager); string strOfNode = node.OuterXml.ToString(); // strOfNode enthält hiernach: // <Node1 xmlns="http://tempuri.org/MyXML.xsd"> // <SubValue1>1</SubValue> // <SubValue2>2</SubValue2> // </Node1>
Gibt es einen Weg den Xml-Node ohne die Namespace Angabe zu bekommen oder muss ich diese Nachträglich entfernen?
Gruß
- Florian
Antworten
-
Hallo Florian,
jetzt erstehe ich, wie du das meinst. In dem Fall würde ich einfach den XML Namespace aus dem Knoten in dem string ersetzen:
var xml = node.OuterXml.Replace("xmlns=\"" + node.NamespaceURI + "\"", "");
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert Florian Haupt Freitag, 17. April 2015 13:52
Alle Antworten
-
Mehrere Varianten zum nachträglichen entfernen habe ich hier gefunden:
http://stackoverflow.com/questions/987135/how-to-remove-all-namespaces-from-xml-with-cWenn es nicht anders geht, muss man es wohl so machen.
- Florian
-
Hallo Florian,
ich würde den Namespace nicht entfernen, wenn er nicht wirklich stört. Schließlich gehört er eigentlich zum Dokument dazu.
Der häufigste Grund warum der Namespace stört ist, das man einfach nicht weiß wohin er führt. In diesem Fall kann man diesen aber dynamisch aus dem XML auslesen:
XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(doc.NameTable); xmlnsManager.AddNamespace("MyXML", doc.DocumentElement.Attributes["xmlns"].Value);
Mit Hilfe der OuterXml-Eigenschaft kannst du dann das gewünschte XML vom Knoten abfragen:var xml = node.OuterXml;
Wichtig ist jedoch, das du damit keine Zeilenumbrüche o.ä. erhältst, da diese für XML nicht zwingend erforderlich sind.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo Tom,
vielen Dank für deine Antwort.
Der Namespace soll im Dokument verbleiben, stört auch im Grunde nicht. Nur steht dieser leider auch im Node, wenn ich mir von diesem mit OuterXml den string hole - eben das hier:
<Node1 xmlns="http://tempuri.org/MyXML.xsd"> <SubValue1>1</SubValue> <SubValue2>2</SubValue2> </Node1>
Hatte ich so nicht erwartet und ich bräuchte diesen Teil ohne die namespace Angabe. Ich denke ich werde den Teil per Regular Expression entfernen.
- Florian
-
Hallo Florian,
jetzt erstehe ich, wie du das meinst. In dem Fall würde ich einfach den XML Namespace aus dem Knoten in dem string ersetzen:
var xml = node.OuterXml.Replace("xmlns=\"" + node.NamespaceURI + "\"", "");
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert Florian Haupt Freitag, 17. April 2015 13:52