所以我试图映射一个Microsoft Excel文件,然后从中提取xml文件。
在我这样做之后,我最终得到了一个类似这样的XML文件:
<domain>
<prio>priority</prio>
<fund>Fundamentals</fund>
</domain>
**<onething />**
<domain>
<prio>priority</prio>
<fund>Fundamentals</fund>
</domain>
**<anotherthing />**
注意** **之间的标签。 Microsoft Excel会在没有值的字段中自动生成它们。
此标记可以是xml映射上的任何标记。因此,这些标签之间唯一的共同点就是字符&#34;&lt;&#34; &#34; /&#34;和&#34;&gt;。示例:<aBadTag/>
所以,我写了一个c#代码,我想做的是: 1 - 检查每次出现的所有XML文件&lt; xxxx /&gt; 2 - 删除该标签。
我到目前为止的代码是:
XmlDocument doc = new XmlDocument();
doc.Load(c:\someXml.xml);
XmlNodeList stuffNodeList = doc.SelectNodes("//*[starts-with(name(), 'domain')]");
foreach (XmlNode stuffNode in stuffNodeList)
{
if (doc.InnerXml.Between("<", "/>") != "") {
//should have code to delete the entire tag
}
}
这个问题是它在第一个&#34;&lt;&#34;之间返回整个代码。 in and the last&#34; /&gt;&#34; in and note&#34;逐行&#34;。
提前谢谢。
答案 0 :(得分:1)
专注于您想要删除的项目:
XmlNodeList deleteList = doc.SelectNodes("//onething | //anotherthing | //aBadTag");
foreach (XmlNode deleteNode in deleteList)
{
deleteNode.ParentNode.Remove(deleteNode);
}
编辑:要仅选择没有内部文字的元素,请使用类似//*[not(text())]
答案 1 :(得分:0)
你可以使用linq。仅选择空节点并将其删除。
doc.root.Descendants().Where(o => string.IsNullOrEmpty(o.Value()).Select(o => o.ParentNode.Remove(o));