2015-08-21 6 views
2

Вот 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> 

Я попытался много способов (в течение недели в настоящее время), чтобы удалить определенный узел (PageInfo) элемент (ID, NUM, URL) в этот xml-файл.

Есть несколько подходов я пытался:

первый подход:

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 is fine)

Отказ от ответственности: все решения, которые я нашел в StackOverflow, не работают для моего конкретного случая.

+0

Итак, вы хотите удалить узел pageInfo, где ваш id = 1 –

+0

Частично да. Он должен удалять его независимо от выбранного элемента. Я имею в виду, что он должен удалить любым из трех значений (ID, NUM, URL). –

ответ

2

На основании 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> 
+0

Я так долго бил вокруг куста с этим. Благодарю. –

+0

Вы можете сделать это даже с linq –

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; 
} 

Теперь вы можете применять запросы в списке, а затем десериализации вашего класса данных обратно в файл. См. This Link для руководства по сериализации.

Смежные вопросы