gpt4 book ai didi

c# - XmlNode.InnerXml 属性 - 省略 xmlns 属性

转载 作者:数据小太阳 更新时间:2023-10-29 02:04:58 25 4
gpt4 key购买 nike

我有一些代码可以替换 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 显然不作为该节点上的属性存在!

最佳答案

两个变化:

  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);

关于c# - XmlNode.InnerXml 属性 - 省略 xmlns 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24082022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com