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

.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");
    }
}

解决方案

原代码存在三个核心问题:

  1. 修改节点前缀时未同步匹配对应命名空间的URI,导致XmlDocument自动生成多余的xmlns属性
  2. 未更新根节点上xsi命名空间的目标URI
  3. 未处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:18:21