如何编辑XML节点?解决查询带命名空间XML节点返回0个的问题
XML节点查找失败与编辑解决方案
问题原因
你的XML根节点<Invoice>属于默认命名空间urn:oasis:names:specification:ubl:schema:xsd:Invoice-2,但原代码的XPath查询/Invoice/cbc:ProfileID未给默认命名空间绑定前缀,导致XPath解析器无法识别根节点,因此返回0个匹配节点。
解决步骤
1. 为默认命名空间添加前缀
在XmlNamespaceManager中给默认命名空间绑定一个自定义前缀(例如ubl),之后在XPath中使用该前缀指代默认命名空间下的节点。
2. 完整代码示例
以下代码实现节点查找、内容编辑及XML保存:
var xmlDoc = new XmlDocument(); xmlDoc.Load("data.xml"); // 配置命名空间管理器,添加所有需要用到的命名空间前缀 var nsm = new XmlNamespaceManager(xmlDoc.NameTable); nsm.AddNamespace("ubl", "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"); nsm.AddNamespace("cbc", "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"); nsm.AddNamespace("cac", "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"); // 查找cbc:ProfileID节点并修改内容 var profileIdNode = xmlDoc.SelectSingleNode("/ubl:Invoice/cbc:ProfileID", nsm); if (profileIdNode != null) { profileIdNode.InnerText = "reporting:2.0"; // 替换为目标内容 } // 示例:查找并修改EmbeddedDocumentBinaryObject节点 var binaryNode = xmlDoc.SelectSingleNode("/ubl:Invoice/cac:AdditionalDocumentReference/cac:Attachment/cbc:EmbeddedDocumentBinaryObject", nsm); if (binaryNode != null) { binaryNode.InnerText = "新的Base64编码内容"; // 更新二进制内容 } // 保存修改后的XML文件 xmlDoc.Save("modified_data.xml");
关键说明
- XML中未指定前缀的节点(如
<Invoice>)会继承根节点的默认命名空间,XPath查询时必须通过绑定的前缀明确指定该命名空间。 - 若只需处理单个节点,使用
SelectSingleNode更高效;若需批量处理多个同类型节点,可使用SelectNodes遍历结果集。
内容的提问来源于stack exchange,提问作者Fares Ayyad
相关产品推荐
相关产品推荐

