如何使用linq将命名空间添加到特定属性?

时间:2016-09-23 11:03:39

标签: .net json xml namespaces

我们使用NewtonSoft的标准.NET功能从XML创建JSON。我们知道我们需要使用命名空间将值定义为数组@Json:Array =" true"但是当我们从SQL Server返回XML时尝试使用命名空间时,我们会遇到一些问题。

我们要做的是在SQL Server Array中指定=" true"然后对XML进行后处理以添加@Json名称空间前缀。

是否有一个XElement方法(可能使用LINQ?),我们可以在一次点击中执行此操作,即将JSON名称空间前缀添加到名为" Array"的所有属性中。 ? 我们不希望将XElement转换为字符串并执行查找/替换(我们已经完成了测试它到目前为止)或者必须对元素进行树形遍历,因为我不能想象一下,这将是非常高效的。

1 个答案:

答案 0 :(得分:0)

我相信你必须做一次树木漫步。

如果您想保留所有属性,则需要使用XElement.ReplaceAttributes。否则,您可以删除旧的并添加新的。 (您无法修改XAttribute的名称。)

示例代码:

using System.Linq;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        var xdoc = new XDocument(
            new XElement("root",
               new XElement("child1",
                   new XAttribute("NotArray", "foo"),
                   new XAttribute("Array", "bar")
               ),
               new XElement("child2",
                   new XAttribute("Array", 0),
                   new XAttribute("Y", 1)
               )
            )
        );
        Console.WriteLine("Before:");
        Console.WriteLine(xdoc);
        Console.WriteLine();

        XNamespace ns = "@Json";
        var attributesToReplace = xdoc
            .Descendants()
            .Attributes("Array")
            .ToList();
        foreach (var attribute in attributesToReplace)
        {
            var element = attribute.Parent;
            attribute.Remove();
            element.Add(new XAttribute(ns + "Array", attribute.Value));
        }
        Console.WriteLine("After:");
        Console.WriteLine(xdoc);
    }
}

输出:

Before:
<root>
  <child1 NotArray="foo" Array="bar" />
  <child2 Array="0" Y="1" />
</root>

After:
<root>
  <child1 NotArray="foo" p2:Array="bar" xmlns:p2="@Json" />
  <child2 Y="1" p2:Array="0" xmlns:p2="@Json" />
</root>