我有一个包含以下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()构建文档时它们才会消失。)
答案 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);