我只是想让我的 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("...")?

你可能决定冒险回答“不”,在这种情况下,我认为公平的做法是等待其他人回答,如果没有人给出体面的答案,我会接受你的“不”,否则如果有人确实提供了答案,我会标记“否”。我希望这对你来说也很公平。

编辑:也许我应该更具体一点,说我希望能够使用多个 namespace ,而不仅仅是一个。

最佳答案

您可以通过指定 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>

关于c# - 在 C# 中,有没有办法使用短前缀而不是每个节点的完整命名空间来生成 XDocument?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6747304/

10-14 08:52