2011-07-19 12 views
7

Po prostu staram się, aby mój XML był trochę bardziej uporządkowany i mniej obszerny. Wiem, że w C# można zrobić coś takiego:W języku C#, czy istnieje sposób generowania dokumentu XD przy użyciu krótkiego prefiksu zamiast pełnej przestrzeni nazw dla każdego węzła?

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

I uzyskać XML simliar do tego:

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

Zamiast coś takiego:

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

oczywiście druga wersja jest znacznie ładniejsza, łatwiejsza do odczytania i zwarta. Czy istnieje sposób na wygenerowanie odpowiednika wersji kompaktowej XDocument, bez wywoływania Parse ("...")?

Możesz podjąć ryzyko i odpowiedzieć "Nie", w którym to przypadku uważam, że uczciwym rozwiązaniem jest czekanie na odpowiedź innych osób, a jeśli nikt nie udzieli przyzwoitej odpowiedzi, przyjmuję Twoje " Nie ", w przeciwnym razie, jeśli ktoś udzieli odpowiedzi, oznaczę" Nie ". Mam nadzieję, że ci się to wydaje sprawiedliwe.

EDYCJA: Być może powinienem być nieco bardziej konkretny i powiedzieć, że chcę móc używać wielu przestrzeni nazw, a nie tylko jednego.

Odpowiedz

10

Można jawnie to zmienić poprzez określenie atrybutu xmlns:

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> 

Domyślnie zachowanie jest określenie xmlns in-line.

XNamespace ns = "urn:test"; 

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

Daje wyjście:

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

więc domyślne zachowanie to pożądane zachowanie, z wyjątkiem, gdy przestrzeń nazw jest już zdefiniowany:

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> 
+0

Nice one! Dzięki Chris :) –

Powiązane problemy