【问题标题】:Xml delete node by elements valuexml按元素值删除节点
【发布时间】:2015-08-21 12:53:19
【问题描述】:

这里是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 上找到的所有解决方案都不适用于我的某些情况。

【问题讨论】:

  • 所以你想删除你的 id = 1 的 pageInfo 节点
  • 部分是的。无论抛出什么元素,它都应该删除它。我的意思是它应该通过三个值(ID、NUM、URL)中的任何一个来删除

标签: c# .net xml


【解决方案1】:

根据 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>

【讨论】:

  • 我一直在拐弯抹角这么久。谢谢。
  • 即使使用 linq 也可以实现
【解决方案2】:

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

示例:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多