XNamespace 作为附加属性,为什么
XNamespace as additional attribute, why
我想实现这个:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="WriteToLogFile" value="true" xdt:Transform="SetAttributes(value)" xdt:Locator="Match(name)" />
<add key="SendErrorEmail" value="false" xdt:Transform="SetAttributes(value)" xdt:Locator="Match(name)" />
</appSettings>
</configuration>
这是我的 C# 代码:
var items = GetItems();
XNamespace xdtNamespace = "xdt";
XDocument doc = new XDocument(new XElement("configuration", new XAttribute(XNamespace.Xmlns + "xdt", "http://schemas.microsoft.com/XML-Document-Transform"),
new XElement("appSettings", from item in items
select new XElement("add",
new XAttribute("key", item.Key),
new XAttribute("value", item.Value),
new XAttribute(xdtNamespace + "Transform", "SetAttributes(value)"),
new XAttribute(xdtNamespace + "Locator", "Match(name)")))));
doc.Declaration = new XDeclaration("1.0", "utf-8", null);
doc.Save("Test.xml");
我的 C# 代码的输出是:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="WriteToLogFile" value="true" p4:Transform="SetAttributes(value)" p4:Locator="Match(name)" xmlns:p4="xdt" />
<add key="SendErrorEmail" value="false" p4:Transform="SetAttributes(value)" p4:Locator="Match(name)" xmlns:p4="xdt" />
</appSettings>
</configuration>
如您所见,每个元素都有一个额外的属性 xmlns:p4="xdt"。
属性 Transform 和 Locator 的前缀是 p4 而不是 xdt。
为什么会这样?
我已经阅读了与 xml 命名空间相关的 msdn 文档(以及其他几篇类似的文章),但坦率地说它很混乱,我没有找到任何有用的东西。
有没有好的文章,简明扼要地解释了我的情况?
您混淆了命名空间别名(您希望成为 xdt
)与命名空间 URI。您希望将元素放在正确的命名空间中(通过 URI),但在根元素中使用您想要的别名指定 xmlns
属性:
using System;
using System.Xml.Linq;
class Test
{
static void Main(string[] args)
{
XNamespace xdt = "http://schemas.microsoft.com/XML-Document-Transform";
XDocument doc = new XDocument(
new XElement("configuration",
new XAttribute(XNamespace.Xmlns + "xdt", xdt.NamespaceName),
new XElement("appSettings",
new XElement("add",
new XAttribute("key", "WriteToLogFile"),
new XAttribute("value", true),
new XAttribute(xdt + "Transform", "SetAttributes(value)"),
new XAttribute(xdt + "Locator", "Match(name)")
)
)
)
);
Console.WriteLine(doc);
}
}
输出:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="WriteToLogFile" value="true" xdt:Transform="SetAttributes(value)" xdt:Locator="Match(name)" />
</appSettings>
</configuration>
我想实现这个:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="WriteToLogFile" value="true" xdt:Transform="SetAttributes(value)" xdt:Locator="Match(name)" />
<add key="SendErrorEmail" value="false" xdt:Transform="SetAttributes(value)" xdt:Locator="Match(name)" />
</appSettings>
</configuration>
这是我的 C# 代码:
var items = GetItems();
XNamespace xdtNamespace = "xdt";
XDocument doc = new XDocument(new XElement("configuration", new XAttribute(XNamespace.Xmlns + "xdt", "http://schemas.microsoft.com/XML-Document-Transform"),
new XElement("appSettings", from item in items
select new XElement("add",
new XAttribute("key", item.Key),
new XAttribute("value", item.Value),
new XAttribute(xdtNamespace + "Transform", "SetAttributes(value)"),
new XAttribute(xdtNamespace + "Locator", "Match(name)")))));
doc.Declaration = new XDeclaration("1.0", "utf-8", null);
doc.Save("Test.xml");
我的 C# 代码的输出是:
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="WriteToLogFile" value="true" p4:Transform="SetAttributes(value)" p4:Locator="Match(name)" xmlns:p4="xdt" />
<add key="SendErrorEmail" value="false" p4:Transform="SetAttributes(value)" p4:Locator="Match(name)" xmlns:p4="xdt" />
</appSettings>
</configuration>
如您所见,每个元素都有一个额外的属性 xmlns:p4="xdt"。 属性 Transform 和 Locator 的前缀是 p4 而不是 xdt。 为什么会这样?
我已经阅读了与 xml 命名空间相关的 msdn 文档(以及其他几篇类似的文章),但坦率地说它很混乱,我没有找到任何有用的东西。
有没有好的文章,简明扼要地解释了我的情况?
您混淆了命名空间别名(您希望成为 xdt
)与命名空间 URI。您希望将元素放在正确的命名空间中(通过 URI),但在根元素中使用您想要的别名指定 xmlns
属性:
using System;
using System.Xml.Linq;
class Test
{
static void Main(string[] args)
{
XNamespace xdt = "http://schemas.microsoft.com/XML-Document-Transform";
XDocument doc = new XDocument(
new XElement("configuration",
new XAttribute(XNamespace.Xmlns + "xdt", xdt.NamespaceName),
new XElement("appSettings",
new XElement("add",
new XAttribute("key", "WriteToLogFile"),
new XAttribute("value", true),
new XAttribute(xdt + "Transform", "SetAttributes(value)"),
new XAttribute(xdt + "Locator", "Match(name)")
)
)
)
);
Console.WriteLine(doc);
}
}
输出:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<appSettings>
<add key="WriteToLogFile" value="true" xdt:Transform="SetAttributes(value)" xdt:Locator="Match(name)" />
</appSettings>
</configuration>