0

我想实现这一点:

    <?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 文档(以及其他几篇类似的文章),但坦率地说,这很令人困惑,我没有发现任何有用的东西。

有没有什么好的文章,简而言之解释我的情况?

4

1 回答 1

2

您将名称空间别名(您想要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>
于 2017-01-09T22:16:44.867 回答