Удалить элемент из файла xml с помощью c# - PullRequest
1 голос
/ 05 августа 2020

недавно у меня возник вопрос в этой ветке: Удалить атрибут узла Xml c# Опять же, я пытаюсь изменить файл xml. Вот xml:

<ApplicationConfiguration>
  <ServerConfiguration>
    <SecurityPolicies>
      <ServerSecurityPolicy>
        <SecurityMode>None_1</SecurityMode>
      </ServerSecurityPolicy>
      <ServerSecurityPolicy>
        <SecurityMode>None_2</SecurityMode>
      </ServerSecurityPolicy>
    </SecurityPolicies>
  </ServerConfiguration>
</ApplicationConfiguration>

Я хочу удалить все узлы ServerSecurityPolicy, поэтому результат будет:

<ApplicationConfiguration>
  <ServerConfiguration>
    <SecurityPolicies>
    </SecurityPolicies>
  </ServerConfiguration>
</ApplicationConfiguration>

Затем я использую этот код:

            string docaddress = "D:\\abc.xml";
            XDocument doc = XDocument.Load(docaddress);
            var root = doc.Root;
            var these = root.Descendants().Where(p => p.Name.LocalName == "ServerSecurityPolicy");        
            foreach (var elem in these)
            {
                elem.Remove();
            }
            doc.Save(docaddress);

Вот проблема:

  • Когда код внутри foreach равен elem.Remove(), он возвращает ошибку, например: «Ссылка на объект не установлена ​​на экземпляр объекта»
  • Когда код внутри foreach равен label1.Text=elem.Name.LocalName, label1 отображает ServerSecurityPolicy. Чтобы elem.Name.LocalName работал нормально, а elem.Remove() - нет?
  • Я пробовал elem.RemoveNodes(). Основываясь на описании void, я думаю, что код удалит все дочерние узлы (узлы SecurityMode), но он не работает (без ошибок, но просто не может ничего удалить). То же самое с elem.RemoveAll(). Вы можете сказать мне, сделал ли я что-нибудь не так? Спасибо

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Этот код поможет получить ожидаемый результат

public static void Main(string[] args)
    {
        string xmlpath = "sample.xml";

        XDocument xdoc = XDocument.Load(xmlpath);

        var list = xdoc.Elements().Descendants().ToList();

        foreach (var item in list)
        {
            item.Descendants("ServerSecurityPolicy").Remove();
        }

        xdoc.Save(xmlpath);
    }
0 голосов
/ 05 августа 2020

это снова я. Я решил это, заменив строку var these = root.Descendants().Where(p => p.Name.LocalName == "ServerSecurityPolicy"); с участием var these = root.Descendants("SecurityPolicies"); затем RemoveAll()

...