我只是想让我的 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/