XmlNode.InnerXml属性-省略xmlns属性

本文关键字:属性 xmlns 省略 XmlNode InnerXml | 更新日期: 2023-09-27 18:07:08

我有一些代码来替换XML文档的根节点名称,同时保留其名称空间。

XmlDocument doc = new XmlDocument();
Stream inStream = inmsg.BodyPart.GetOriginalDataStream();
doc.Load(inStream);
XmlNode root = doc.DocumentElement;
XmlNode replacement = doc.SelectSingleNode("/*/*[1]");
XmlNode newRoot = doc.CreateElement(replacement.Name);
XmlAttribute xmlns = (XmlAttribute)root.Attributes["xmlns"].Clone();
newRoot.Attributes.Append(xmlns);
newRoot.InnerXml = root.InnerXml; //the problem is here!
doc.ReplaceChild(newRoot, root);

文档开头如下:

<OLD_ROOT xmlns="http://my.xml.namespace">
    <NEW_ROOT>

结果是:

<NEW_ROOT xmlns="http://my.xml.namespace">
     <NEW_ROOT xmlns="http://my.xml.namespace">

第二个xmlns是因为InnerXml属性显然将其设置在其内容的第一个节点上!我能做些什么来绕过这个,而不需要移除它吗?

之后无法删除:

尝试使用以下代码

XmlNode first_node = doc.SelectSingleNode("/*/*[1]");
XmlAttribute excess_xmlns = first_node.Attributes["xmlns"];
first_node.Attributes.Remove(excess_xmlns);

但这不起作用,因为xmlns显然不存在作为该节点上的属性!

XmlNode.InnerXml属性-省略xmlns属性

两个变化:

  1. 在创建newRoot之后不添加xmlns属性,而是在调用doc.CreateElement时将名称空间指定为第二个参数。这确保NamespaceURI属性被正确设置。
  2. 不要复制InnerXml(这会导致多余的xmlns属性),而是使用AppendChild一次移动每个子节点。这可能会更有效率。

:

XmlNode root = doc.DocumentElement;
XmlNode replacement = doc.SelectSingleNode("/*/*[1]");
XmlNode newRoot = doc.CreateElement(replacement.Name, replacement.NamespaceURI);
while (root.ChildNodes.Count > 0)
    newRoot.AppendChild(root.FirstChild);
doc.ReplaceChild(newRoot, root);