Frage Gibt es in C # eine Möglichkeit, ein XDocument mit dem Kurzpräfix statt dem vollständigen Namespace für jeden Knoten zu generieren?


Ich versuche einfach, meine XML etwas aufgeräumter und weniger sperrig zu machen. Ich weiß in C # kann man so etwas machen:

XNamespace ds = "http://schemas.microsoft.com/ado/2007/08/dataservices";
new XElement(ds + "MyDumbElementName", "SomethingStupid");

Und dazu ein XML-Similar:

<root>
    <MyDumbElementName xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">
        SomethingStupid
    </MyDumbElementName>
</root>

Anstelle von etwas wie diesem:

<root xmlns:ds="http://schemas.microsoft.com/ado/2007/08/dataservices">
    <ds:MyDumbElementName>
        SomethingStupid
    </ds:MyDumbElementName>
</root>

Offensichtlich ist die zweite Version viel hübscher, einfacher zu lesen und kompakt. Gibt es eine Möglichkeit, ein XDocument-Äquivalent der Kompaktversion zu generieren, ohne Parse ("...") aufzurufen?

Sie können ein Risiko eingehen und mit "Nein" antworten. In diesem Fall glaube ich, dass es fair ist, darauf zu warten, dass andere Leute antworten, und wenn niemand eine vernünftige Antwort gibt, nehme ich ansonsten Ihr "Nein" an Wenn jemand eine Antwort gibt, markiere ich das "Nein". Ich hoffe, dass dir das auch fair erscheint.

EDIT: Vielleicht sollte ich etwas genauer sein und sagen, dass ich in der Lage sein möchte, mehrere Namensräume zu verwenden, nicht nur einen.


7
2017-07-19 12:42


Ursprung


Antworten:


Sie können dieses Verhalten explizit überschreiben, indem Sie das Attribut xmlns angeben:

XNamespace ns = "urn:test";

new XDocument (
    new XElement ("root",
        new XAttribute (XNamespace.Xmlns + "ds", ns),
        new XElement (ns + "foo",
            new XAttribute ("xmlns", ns),
            new XElement (ns + "bar", "content")
        ))
).Dump ();

<root xmlns:ds="urn:test">
  <foo xmlns="urn:test">
    <bar>content</bar>
  </foo>
</root> 

Standardmäßig besteht das Verhalten darin, die xmlns in-line anzugeben.

XNamespace ns = "urn:test";

new XDocument (
    new XElement ("root",
        new XElement (ns + "foo",
            new XElement (ns + "bar", "content")
        ))
).Dump ();

Gibt die Ausgabe:

<root>
  <foo xmlns="urn:test">
    <bar>content</bar>
  </foo>
</root>

Das Standardverhalten ist also das gewünschte Verhalten, außer wenn der Namespace bereits definiert ist:

XNamespace ns = "urn:test";

new XDocument (
    new XElement ("root",
        new XAttribute (XNamespace.Xmlns + "ds", ns),
        new XElement (ns + "foo",
            new XElement (ns + "bar", "content")
        ))
).Dump ();

<root xmlns:ds="urn:test">
  <ds:foo>
    <ds:bar>content</ds:bar>
  </ds:foo>
</root> 

10
2017-07-19 12:57