Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将XML名称空间提升到根元素_C#_Xml_Vb.net_Xml Namespaces_Workflow Foundation - Fatal编程技术网

C# 如何将XML名称空间提升到根元素

C# 如何将XML名称空间提升到根元素,c#,xml,vb.net,xml-namespaces,workflow-foundation,C#,Xml,Vb.net,Xml Namespaces,Workflow Foundation,如果我有一个名称空间如下的XML文件: 苹果 香蕉 非洲咖啡桌 80 120 我想将所有名称空间提升到根元素,如下所示: 苹果 香蕉 非洲咖啡桌 80 120 有办法做到这一点吗?理想情况下,自动解析冲突的命名空间前缀,如上面的示例所示。我还没有承诺使用LINQtoXML或System.XML,所以两者都有可能 有一个主要限制:由于我工作的环境,我无法编写类。我可以编写函数,但没有新的类定义。事实证明这非常简单: var doc = XDocument.Parse(xml); var n

如果我有一个名称空间如下的XML文件:


苹果
香蕉
非洲咖啡桌
80
120
我想将所有名称空间提升到根元素,如下所示:


苹果
香蕉
非洲咖啡桌
80
120
有办法做到这一点吗?理想情况下,自动解析冲突的命名空间前缀,如上面的示例所示。我还没有承诺使用LINQtoXML或System.XML,所以两者都有可能


有一个主要限制:由于我工作的环境,我无法编写类。我可以编写函数,但没有新的类定义。

事实证明这非常简单:

var doc = XDocument.Parse(xml);
var namespaceAttributes = doc.Descendants()
    .SelectMany(x => x.Attributes())
    .Where(x => x.IsNamespaceDeclaration);
int count = 1;
foreach (var namespaceAttribute in namespaceAttributes)
{
    doc.Root.Add(new XAttribute(XNamespace.Xmlns + $"h{count}", namespaceAttribute.Value));
    namespaceAttribute.Remove();
    count++;
}
我们遍历所有名称空间声明(
xmlns:foo=“foo”
)。对于找到的每个元素,我们在根元素上放置一个具有相同URL的名称空间属性,并删除该属性


请注意,如果您有多个名称空间具有相同的URL(例如,如果您有两个
xmlns:h=”,那么这会有点奇怪https://www.namespaces.com/namespaceOne“
在不同的子元素上):它在具有相同URL的根元素上放置多个
xmlns
声明,但所有元素都使用最后一个这样的命名空间。如果要避免这种情况,只需保留已添加到根元素的名称空间列表。

这些XML文档是等效的。为什么要将名称空间移到根目录下?因为我为之编写的平台希望它采用这种格式。哦,天哪,另一个平台不能处理XML。祝你好运您是否考虑过将其报告为平台的bug?我假设那些
f
元素应该是
h
?否则这是无效的,谢谢。最重要的信息是x.IsNamespaceDeclaration,以及对LinqtoXML功能的重新评价。但是,还需要更新节点前缀,以便它们引用正确的名称空间。可以通过获取父级并维护名称空间列表来完成。@BenMann您尝试过吗?您根本不需要更新单个元素。解析文档时,每个元素的名称都与名称空间的URL相关联,而不是与名称空间的名称相关联。当您再次序列化XDocument时,它会注意到已经有了一个xmlns,其中每个元素的名称都有正确的URL,并替换为xmlns的名称。我添加了一个指向工作演示的链接。