使用C#更新/删除XML中的给定字符串

时间:2016-11-17 18:54:26

标签: c# xml excel

所以我试图映射一个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;。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

专注于您想要删除的项目:

 XmlNodeList deleteList = doc.SelectNodes("//onething | //anotherthing | //aBadTag");  
 foreach (XmlNode deleteNode in deleteList)
 {
     deleteNode.ParentNode.Remove(deleteNode);
 }

编辑:要仅选择没有内部文字的元素,请使用类似//*[not(text())]

的XPath

答案 1 :(得分:0)

你可以使用linq。仅选择空节点并将其删除。

doc.root.Descendants().Where(o => string.IsNullOrEmpty(o.Value()).Select(o => o.ParentNode.Remove(o));