.NET6 Core API中修改XML的命名空间前缀、属性及命名空间值
.NET6 Core API XML 修改问题
现有 XML 内容
<?xml version="1.0" encoding="UTF-8"?> <note xmlns="http://test.co.uk" xmlns:temp="http://tes007.co.uk" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Header> <Title>Hello</Title> </Header> <PutData> <Credentials> <Username>Test</Username> <Password>1234</Password> </Credentials> <Payload> <Filename>test.xml</Filename> <FileType>Xml</FileType> </Payload> <message> <title>Title1</title> <body></body> </message> </PutData> </note>
期望 XML 内容
<?xml version="1.0" encoding="UTF-8"?> <note xmlns="http://test.co.uk" xmlns:temp="http://tes007.co.uk" xmlns:xsi="http://test0010.com.br"> <xsi:Header> <Title>Hello</Title> </xsi:Header> <temp:PutData> <Credentials> <Username>Test</Username> <Password>1234</Password> </Credentials> <Payload> <Filename>test.xml</Filename> <FileType>Xml</FileType> </Payload> <message Type="TEST007"> <title>Title1</title> <body></body> </message> </temp:PutData> </note>
尝试的代码(仅部分生效)
XmlDocument doc = XmlDocument.LoadXml(xml); var xPath = "//*"; //all nodes foreach(XmlElement node in doc.SelectNodes(xPath)) { if(node.Name == "Header") { node.Prefix = "xsi"; node.RemoveAttribute("xmlns"); } if(node.Name == "PutData") { node.Prefix = "temp"; node.RemoveAttribute("xmlns"); } }
解决方案
原代码存在三个核心问题:
- 修改节点前缀时未同步匹配对应命名空间的URI,导致XmlDocument自动生成多余的xmlns属性
- 未更新根节点上xsi命名空间的目标URI
- 未处理message节点的Type属性添加需求
以下是修正后的完整代码:
XmlDocument doc = new XmlDocument(); doc.LoadXml(xml); // 初始化命名空间管理器,定位默认命名空间下的节点 XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable); nsManager.AddNamespace("ns", "http://test.co.uk"); nsManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); // 1. 更新xsi命名空间的URI为目标值 XmlAttribute xsiAttr = doc.SelectSingleNode("/ns:note/@xmlns:xsi", nsManager) as XmlAttribute; if (xsiAttr != null) { xsiAttr.Value = "http://test0010.com.br"; } // 2. 修改Header节点的前缀和对应命名空间 XmlElement headerNode = doc.SelectSingleNode("/ns:note/ns:Header", nsManager) as XmlElement; if (headerNode != null) { headerNode.SetAttribute("xmlns", "http://test0010.com.br"); headerNode.Prefix = "xsi"; } // 3. 修改PutData节点的前缀和对应命名空间 XmlElement putDataNode = doc.SelectSingleNode("/ns:note/ns:PutData", nsManager) as XmlElement; if (putDataNode != null) { putDataNode.SetAttribute("xmlns", "http://tes007.co.uk"); putDataNode.Prefix = "temp"; } // 4. 给message节点添加Type属性 XmlElement messageNode = doc.SelectSingleNode("/ns:note/ns:PutData/ns:message", nsManager) as XmlElement; if (messageNode != null) { messageNode.SetAttribute("Type", "TEST007"); } // 获取修改后的XML字符串 string modifiedXml = doc.OuterXml;
关键要点
- 使用
XmlNamespaceManager精准定位默认命名空间下的节点,避免因命名空间缺失导致的节点查找失败 - 修改节点前缀前,必须将节点的命名空间URI设置为对应前缀的目标地址,否则XmlDocument会自动补充多余的命名空间声明
- 直接修改根节点上的xsi命名空间属性值,替换为期望的URI
- 最后通过
SetAttribute为message节点添加Type属性
内容的提问来源于stack exchange,提问作者prezequias
相关产品推荐
相关产品推荐

