c# - 如何用前缀替换 xmlns 命名空间属性?

标签 c# xml xml-parsing xml-namespaces prefix

我一直在尝试用 C# 编写一个实用程序,它采用 XML 文件,从标签中删除 xmlns 属性,在根标签中设置这些属性的前缀,然后在标签中使用这些前缀。

源 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<Main version="1.0" xmlns="urn:root:v1">
    <Report>
        <Title>Some Value</Title>
    </Report>
    <Content>
        <Address>
            <CountryName xmlns="urn:location:v2">Australia</CountryName>
        </Address>
    </Content>
</Main>

目标 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<root:Main version="1.0" xmlns:root="urn:root:v1" xmlns:loc="urn:location:v2">
    <root:Report>
        <root:Title>Some Value</root:Title>
    </root:Report>
    <root:Content>
        <root:Address>
            <loc:CountryName>Australia</loc:CountryName>
        </root:Address>
    </root:Content>
</root:Main>

我已经通过以下代码成功实现了这一点。我已将所有没有属性的标签替换为根前缀,并将 xmlns 属性添加到根标签,但未能成功从 CountryName 标签中删除 xmlns 属性并改用那里的前缀。

XDocument doc = XDocument.Load(@"C:\Temp\Source.xml");

var content = XElement.Parse(doc.ToString());

content.Attributes("xmlns").Remove();

content.Add(new XAttribute(XNamespace.Xmlns + "root", "urn:root:v1"));
content.Add(new XAttribute(XNamespace.Xmlns + "loc", "urn:location:v2"));

foreach (var node in doc.Root.Descendants().Where(n => n.Name.NamespaceName == "urn:location:v2"))
{
    node.Attribute("xmlns").Remove();
    node.Add(new XAttribute(XNamespace.Xmlns + "loc", "urn:location:v2"));
}   

content.Save(@"C:\Temp\Target.xml");

任何帮助将不胜感激 - 谢谢!

最佳答案

你距离我们还不到一百万英里。您需要做的就是删除任何现有的命名空间声明属性,然后将所需的属性添加到根。其余的将被处理。

var doc = XDocument.Load(@"C:\Temp\Source.xml");

doc.Descendants().Attributes().Where(x => x.IsNamespaceDeclaration).Remove();
doc.Root.Add(new XAttribute(XNamespace.Xmlns + "root", "urn:root:v1"));
doc.Root.Add(new XAttribute(XNamespace.Xmlns + "loc", "urn:location:v2"));

doc.Save(@"C:\Temp\Target.xml");

参见this fiddle进行演示。

关于c# - 如何用前缀替换 xmlns 命名空间属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45246305/

相关文章:

c# - 如何使用 C# 以编程方式复制 MS SQL 2000 数据库?

c# - Blazor 处理来自 Web Api 的响应中的错误

java - 如何调试 DOMImplementation 版本上的 java 依赖失败

java - 创建名称为 'sessionFactory' 的 bean 时出错无法实例化默认 tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]

java - JAXB:缺少命名空间

php - PHP 的最佳 XML 解析器

c# - 为什么这个可执行文件图标看起来很糟糕,而图标本身却没有?

android - 就 Android、XML 或 JSON 的解析性能而言,哪个更好?

java - 连接两个响应

c# - 我在这里用什么代替 int ? C#命令