Xml按元素值删除节点

时间:2015-08-21 12:53:20

标签: c# .net xml

这是xml文件:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Data>
  <PageInfo>
   <ID>0</ID>
   <NUM>5</NUM>
   <URL>er.php</URL>
  </PageInfo>
  <PageInfo>
   <ID>1</ID>
   <NUM> 12345</NUM>
   <URL>/out/out.ViewFolder.php</URL>
  </PageInfo>
</Data>

我已经尝试了很多方法(现在一周)在此xml文件中按元素(ID,NUM,URL)删除某个节点(PageInfo)。

我尝试的方法很少:

第一种方法:

  XmlDocument docc = new XmlDocument();
  docc.LoadXml(AppDomain.CurrentDomain.BaseDirectory + "/WebData.xml");
  XmlNode nodee = docc.SelectSingleNode("/Data/PageInfo/ID[2]");
  nodee.RemoveAll();

第二种方法:

  XmlDocument document = new XmlDocument();
  document.Load(AppDomain.CurrentDomain.BaseDirectory + "/WebData.xml");
  XmlNodeList nodes = document.DocumentElement.SelectNodes("/Data/PageInfo");

  string ID, NUM, URL;

  foreach (XmlNode node in nodes)
  {
       ID = node.SelectSingleNode("ID").InnerText;
       NUM = node.SelectSingleNode("NUM").InnerText;
       URL = node.SelectSingleNode("URL").InnerText;
       node.RemoveAll();
       Console.WriteLine(ID + " " + NUM + " " + URL + "\n");
  }

第一个解决方案没有触发和异常,但没有任何反应,第二个解决方案抛出异常:根级别的数据无效。

如何通过xml文件中的元素值删除节点? (LINQ很好)

免责声明:我在StackOverflow上找到的所有解决方案都不适用于我的特定情况。

2 个答案:

答案 0 :(得分:3)

根据ID,请尝试此解决方案:

第一种方法

string xml = AppDomain.CurrentDomain.BaseDirectory + "/WebData.xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xml);
XmlNode t = xmlDoc.SelectSingleNode("/Data/PageInfo[ID='0']");
t.ParentNode.RemoveChild(t);
xmlDoc.Save(xml);

第二种方法:Linq

 XDocument xmlDoc =  XDocument.Load(xml);
            var pageInfo = (from xml2 in xmlDoc.Descendants("PageInfo")
                            where xml2.Element("ID").Value == "0"
                            || xml2.Element("NUM").Value == "5"
                            || xml2.Element("URL").Value == "er.php"
                                select xml2).FirstOrDefault();

            pageInfo.Remove();
            xmlDoc.Save(xml);

//输出

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Data>
  <PageInfo>
    <ID>1</ID>
    <NUM> 12345</NUM>
    <URL>/out/out.ViewFolder.php</URL>
  </PageInfo>
</Data>

答案 1 :(得分:0)

由于<Data>是一个数组,因此您可以在具有Data的类List<PageInfo>中对其进行反序列化,以便您可以相应地更新数据,然后在文件中将其序列化。

示例:

XmlArray("Data")]
public class Data
{
    [XmlArrayItem("PageInfo")]
    public List<PageInfo> pageInfos = new List<PageInfo>();
}

public class PageInfo
{
    public int ID;
    public int NUM;
    public string URL;
}

现在,您可以在列表中应用查询,然后将Data类反序列化回文件。有关序列化指南,请参阅This Link