首页 > 解决方案 > 如何使用 XDocument 添加 xml 前缀?

问题描述

如何使用 XDocument 将 xml 前缀添加到现有根元素?我有以下 XML:

<processSalesOrder>
  <header/>
</processSalesOrder>

我希望它看起来像:

<ns0:processSalesOrder xmlns:ns0='https://xyx/'>
  <header/>
</ns0:processSalesOrder>

在我的场景中,我从 web api 接收这个 xml 并将其长时间传递给另一个 web 服务。Web 服务需要根元素上的命名空间前缀。

Web 服务来自第三方软件,它需要某种格式的 xml。我尝试了 XmlDocument、XDocument 等...我找不到仅在根元素上添加命名空间前缀的方法。如果前缀在后代上,Webservice 将拒绝交易。

标签: c#xmlbiztalkwcf-web-api

解决方案


从这里获得参考开发人员名称:Vijay Sirigiri

如果您在加载 xml 文档后尝试向元素添加命名空间,那么这是不可能的。

来自 MSDN:

在将文档加载到 XML 文档对象模型 (XMLDOM) 解析器后,您不能在 XML 文档的实例中添加、修改或删除 XML 命名空间定义。用于表示 XML 文档中数据的 XML 节点是在将文档加载到 XMLDOM 解析器时创建的。这些节点在创建时永久绑定到它们的 XML 命名空间属性。因此,将空的 XML 命名空间声明 (xmlns = "") 附加到这些节点的子节点,以保留这些节点的默认 XML 命名空间属性。

但是,您可以加载输入,读取每个元素并将其写入具有命名空间集的另一个文档(或内存中)。下面是解析字符串 xml、创建一个新的 xml 元素以及命名空间前缀和命名空间的代码。

            String xmlWithoutNamespace =
                @"<Folio><Node1>Value1</Node1><Node2>Value2</Node2><Node3>Value3</Node3></Folio>";
            String prefix ="vs";
            String testNamespace = "http://www.testnamespace/vs/";
            XmlDocument xmlDocument = new XmlDocument();

            XElement folio = XElement.Parse(xmlWithoutNamespace);
            XmlElement folioNode = xmlDocument.CreateElement(prefix, folio.Name.LocalName, testNamespace);

            var nodes = from node in folio.Elements()
                        select node;

            foreach (XElement item in nodes)
            {
                var node = xmlDocument.CreateElement(prefix, item.Name.ToString(), testNamespace);
                node.InnerText = item.Value;
                folioNode.AppendChild(node);
            }

            xmlDocument.AppendChild(folioNode);

xmlDocument 现在包含每个节点以 vs 为前缀的 xml。


推荐阅读