.NET XmlDocument:在OuterXml中包含默认名称空间前缀

时间:2015-03-12 18:14:46

标签: .net xml namespaces

我有一个包含以下XML的XmlDocument对象:

<root>
   <childlist xmlns:pre="mydomain.com">
     <pre:child someattribute="value" />
  </childlist>
</root>

客户端应用程序以字符串形式接收XML文档,要求该元素具有&#34; pre:&#34;前缀。

我的问题是,当我使用.OuterXml方法从XmlDocument获取XML文本时,前缀将被删除:

<root>
  <childlist xmlns:pre="mydomain.com">
    <child someattribute="value" />  <!--where's the prefix?-->
  </childlist>
</root>

据我所知,从技术上讲,默认命名空间不需要前缀,但同样,接收此XML的客户端不会在没有前缀的情况下工作。

当我使用调试器检查节点时,.Name属性为&#34; pre:child&#34;。所以XmlDocument对象存储了前缀,它只是没有出现在.OuterXml中。

有没有办法序列化XmlDocument对象并包含元素名称前缀?

我玩了几种使用XmlSerializer和XmlTextWriter对象的方法,但我得到了相同的结果。也许在XmlDocument,XmlSerializer或XmlTextWriter上有一个属性,它指定我希望默认的名称空间前缀包含在输出中?

(顺便说一下,如果你只是使用.LoadXml()将上述XML加载到XmlDocument对象中,前缀将出现在.OuterXml中。只有在使用.AppendNode()构建文档时它们才会消失。)

2 个答案:

答案 0 :(得分:0)

有点找到答案:

http://bytes.com/topic/c-sharp/answers/568487-inserting-xml-node-maintaining-prefix

它并不完美 - 它假设提供NamespacedURI的元素也需要前缀。但这是一个可行的开始。

答案 1 :(得分:0)

我遇到了同样的问题,关键似乎是添加一个XmlNode作为NodeType元素。与直接添加为XmlElement。

请注意,&#34; urn:something:mapper:somethingelse:commontypes&#34;将来自XML文档中指定的名称空间。

        XmlNodeList xNodSIDetails = xDoc.GetElementsByTagName("pt:SIDetails");
        // Select the parent node where you want to add the element
        XmlNode xSID = xNodSIDetails[0];
        // Select the peer node that you want to insert the element after.
        XmlNode xLotNum = xNodSIDetails[0].ChildNodes[3];
        // Create the node, of the type Element, with the name you want including the prefix and the namespace URI.
        XmlNode xn = xDoc.CreateNode(XmlNodeType.Element,"cmn:ExpirationDate", "urn:something:mapper:somethingelse:commontypes"); 
        //  Assign the Node the inner text value.
        xn.InnerText = "1999-03-24";
        //  Insert the node after the one you previous chose for this to follow.
        xSID.InsertAfter(xn, xLotNum);