如何使用XDocument添加xml前缀?

时间:2018-07-05 21:59:17

标签: c# xml biztalk wcf-web-api

如何使用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将拒绝交易。

3 个答案:

答案 0 :(得分:0)

Got Reference from here开发人员名称: Vijay Sirigiri

如果您尝试在加载xml文档后向元素添加名称空间,则不可能。

从MSDN:

  

您不能添加,修改或删除   中的XML名称空间定义   XML文档的实例   文档已加载到XML中   文档对象模型(XMLDOM)解析器。   用于以下目的的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现在包含xml,每个节点都以vs.为前缀。

答案 1 :(得分:0)

您正在尝试为空名称空间指定别名。 XDocument不允许:

  

前缀'ns0'不能绑定到空的名称空间名称。

所以不,我认为您无法使用XDocument来做到这一点。我认为这样做甚至都不是有效的XML-我的重点是:

  

[定义:]如果属性名称与PrefixedAttName匹配,则NCName给出名称空间前缀,该前缀用于将元素和属性名称与声明附加到的元素范围内的属性值中的名称空间名称相关联。 在此类声明中,名称空间名称不能为空。

     

[定义:]如果属性名称与DefaultAttName匹配,则属性值中的名称空间名称是声明所附加的元素范围内的默认名称空间的名称空间。 在这种默认声明中,属性值可能为空。“ 5。将命名空间应用于元素和属性”中讨论了默认命名空间和声明覆盖。

答案 2 :(得分:0)

根据Roberts的评论,您可以使用添加名称空间管道组件在接收管道中添加名称空间。如果您拥有BizTalk Enterprise并安装了ESB Toolkit,则可以使用一个现成的名为ESB Add Namespace的框,或者您必须编写自己的管道组件来执行此操作。

另一种选择是拥有两个模式,一个没有在您的接收管道的XML反汇编程序组件中指定的名称空间,另一个具有名称空间的模式,并且您具有一个到另一个的映射。如果您不希望元素上的名称空间前缀,则第二个模式应将ElementFormDefault设置为(默认)或不合格。如果将来要进行验证,则还将具有规范/内部架构,并在接收端口上从源架构映射到内部架构,在发送端口上从内部架构映射到目标架构。