我们使用NewtonSoft的标准.NET功能从XML创建JSON。我们知道我们需要使用命名空间将值定义为数组@Json:Array =" true"但是当我们从SQL Server返回XML时尝试使用命名空间时,我们会遇到一些问题。
我们要做的是在SQL Server Array中指定=" true"然后对XML进行后处理以添加@Json名称空间前缀。
是否有一个XElement方法(可能使用LINQ?),我们可以在一次点击中执行此操作,即将JSON名称空间前缀添加到名为" Array"的所有属性中。 ? 我们不希望将XElement转换为字符串并执行查找/替换(我们已经完成了测试它到目前为止)或者必须对元素进行树形遍历,因为我不能想象一下,这将是非常高效的。
答案 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>