You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编辑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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:33:36