Удалить все узлы исполнителя из XML-файла

#c# #.net #xml

#c# #.net #xml

Вопрос:

У меня есть XmlWriter, который содержит xml, похожий на приведенный ниже, только с намного большим количеством узлов. какой самый быстрый и оптимальный способ удалить все узлы ИСПОЛНИТЕЛЯ из этого xml?

 <CATALOG> 
  <CD> 
    <TITLE>Empire Burlesque</TITLE> 
    <ARTIST>Bob Dylan</ARTIST> 
  </CD> 
  <CD> 
    <TITLE>Hide your heart</TITLE> 
    <ARTIST>Bonnie Tyler</ARTIST>
  </CD>
</CATALOG> 
  

Комментарии:

1. Вам нужно использовать XmlWriter или вы можете использовать XmlDocument или XDocument?

2. Мне нужно использовать XmlWriter. если есть быстрый способ перевести его в XmlDucument и вернуть обратно, возможно, этого достаточно.

3. XmlWriter не может «содержать» XML-файл — он также не может его прочитать или сохранить. Как вы читаете или сохраняете XML? Кстати, я бы предложил использовать XSLT — используйте шаблон по умолчанию для вывода всего, кроме исполнителя. Единственная причина, по которой я предлагаю, заключается в том, что XSLT предназначен для преобразования XML-файлов.

Ответ №1:

Пока файл не занимает гигабайты, XmlDocument должен быть в порядке:

     XmlDocument XDoc = new XmlDocument();
    XDoc.Load(MapPath(@"~xmltest.xml"));

    XmlNodeList Nodes = XDoc.GetElementsByTagName("ARTIST");

    foreach (XmlNode Node in Nodes)
        Node.ParentNode.RemoveChild(Node);

    XDoc.Save(MapPath(@"~xmltest_out.xml"));
  

Ответ №2:

Когда я попробовал решение Стива, я получил следующую ошибку «Список элементов изменился. Не удалось продолжить операцию перечисления«. Я знаю, что это немного сложно, но чтобы обойти это, я использовал следующее:

 //Load XML
XmlDocument XDoc = new XmlDocument();
XDoc.Load(MapPath(@"~xmltest.xml"));

//Get list of offending nodes
XmlNodeList Nodes = XDoc.GetElementsByTagName("ARTIST");

//Loop through the list
while (Nodes.Count != 0) {
    foreach (XmlNode Node in Nodes) {
        //Remove the offending node
        Node.ParentNode.RemoveChild(Node); //<--This line messes with our iteration and forces us to get a new list after each remove
        //Stop the loop
        break;
    }
    //Get a refreshed list of offending nodes
    Nodes = XDoc.GetElementsByTagName("ARTIST");
}
//Save the document
XDoc.Save(newfile);
  

Я был в затруднительном положении и нуждался в чем-то быстром, и эта работа была выполнена.

Ответ №3:

Судя по тому, как сформулирован ваш вопрос, я предполагаю, что у вас есть XmlWriter, который использовался для написания XmlDocument, и вы хотите манипулировать тем, что он собирается записать перед flush вызовом.

Я боюсь, что то, что вы пытаетесь сделать, может оказаться невозможным. XmlWriter не предназначен для манипулирования XML до того, как он будет записан в конечный поток.

Комментарии:

1. Я не возражаю загрузить его в xmldoucment и сохранить в bacl после манипуляций