【发布时间】:2015-02-09 21:58:31
【问题描述】:
在 XML 中取消注释某个节点的正文的最简单方法是什么?元素具有唯一名称,文档结构如下:
一些文件.xml
<?xml version="1.0"?>
<name1>
<irrelevant1>
<irrelevant2>
<!--
<irrelevant3 />
-->
</irrelevant2>
</irrelevant1>
<name2>
<name3>
<!--
<name4 field="The" />
<name4 field="Owls" />
<name4 field="Are />
<name4 field="Not" />
<name4 field="What" />
<name4 field="They" />
<name4 field="Seem />
-->
</name3>
</name2>
</name1>
目标应该是这样的,移除了 cmets:
uncommented.xml
<?xml version="1.0"?>
<name1>
<irrelevant1>
<irrelevant2>
<!--
<irrelevant3 />
-->
</irrelevant2>
</irrelevant1>
<name2>
<name3>
<name4 field="The" />
<name4 field="Owls" />
<name4 field="Are />
<name4 field="Not" />
<name4 field="What" />
<name4 field="They" />
<name4 field="Seem />
</name3>
</name2>
</name1>
我的解析方法:
XmlDocument xdoc = new XmlDocument();
xdoc.Load(@"C:\somefile.xml");
XmlNodeList nl = xdoc.GetElementsByTagName("name2");
XmlNode xn = nl[0];
string xn_content = xn.InnerXml;
xn_content = Regex.Replace(xn_content, "<!--|-->", String.Empty);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xn_content);
XmlNode newNode = doc.DocumentElement;
// this import doesn't really help
xdoc.ImportNode(newNode, true);
xn.RemoveAll();
xn.AppendChild(newNode);
xdoc.Save(@"C:\uncommented.xml");
带有 ArgumentException 的结果:
{"要插入的节点来自不同的文档上下文。"}
【问题讨论】:
-
您愿意使用 Linq to XML (XDocument) 吗?
-
为什么 irrelevant3 没有被取消注释。
irrelevant2和name3使用的规则是什么。为什么只有name3s 的孩子没有注释?我们如何以编程方式区分它们? -
您缺少
<name4 field="Are />的右引号。应该是<name4 field="Are" />。也适用于<name4 field="Seem />。 -
@EZI :我使用 xdoc.GetElementsByTagName("name2") 仅处理部分内容,这样我的正则表达式就可以针对所需的片段
-
@sirVir 在 Linq 中,您只需获取后代节点并遍历它们以检查它们是否是 XComment。然后调用 ReplaceWith() 方法,将 XComment.Value 属性传递给它。您的 XComment 现在是 XElement。