В C # есть ли способ сгенерировать XDocument, используя короткий префикс вместо полного пространства имен для каждого узла? - PullRequest
7 голосов
/ 19 июля 2011

Я просто пытаюсь сделать мой XML немного более аккуратным и менее громоздким.Я знаю, что в C # можно сделать что-то вроде этого:

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

И получить XML-аналог этого:

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

Вместо чего-то вроде этого:

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

Очевидно, что вторая версия намного красивее, удобнее для чтения и компактна.Есть ли способ сгенерировать XDocument, эквивалентный компактной версии, без вызова Parse ("...")?

Вы можете рискнуть и ответить «Нет», и в этом случае я считаю, чтоЧестно сказать, подождите, пока другие люди ответят, и если никто не даст достойного ответа, я приму ваше «Нет», в противном случае, если кто-то ответит, я отмечу «Нет» вниз.Я надеюсь, что это кажется вам справедливым.

РЕДАКТИРОВАТЬ: Возможно, я должен быть более конкретным и сказать, что я хочу иметь возможность использовать несколько пространств имен, а не только одно.

1 Ответ

10 голосов
/ 19 июля 2011

Вы можете явно переопределить это поведение, указав атрибут 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> 

По умолчанию поведение заключается в указании встроенного xmlns.

XNamespace ns = "urn:test";

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

Дает вывод:

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

Таким образом, поведение по умолчанию - это желаемое поведение, кроме случаев, когда пространство имен уже определено:

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> 
...