Проблема удаления всех узлов из файла XML с помощью LINQ - PullRequest
4 голосов
/ 21 ноября 2011

Я пытаюсь удалить все узлы из файла XML.Но он также удаляет открытый тег корневого узла. Использование C # и Linq

Ввод:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--Log the error count and error message-->
<root>
    <ErrData>
        <Count>1</Count>
        <Timestamp>2011-11-21T11:57:12.3539044-05:00</Timestamp>
     </ErrData>
     <ErrData>max of 20 ErrData elements</ErrData>
 </root>

Ожидаемый OP:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!--Log the error count and error message-->
<root>
</root>

Фактический OP: EDITED

<?xml version="1.0" encoding="utf-8" standalone="no"?>
    <!--Log the error count and error message-->
<root />

Код:

XDocument docs = XDocument.Load(path);
try
{                   
    docs.Descendants("ErrData").Remove();
}

КОД:

Ниже приведен код, который я использую, концепция - это счетчик ошибок и временная метка.XML-файл. Как только он достигнет порогового значения, электронная почта будет отправлена ​​функцией и удалит все узлы из xml.Затем, когда появится следующая ошибка, она начнет входить в XML-файл, как показано ниже:

XDocument doc = null;
XElement el;
if (!System.IO.File.Exists(path))
{

    doc = new XDocument(new XDeclaration("1.0", "utf-8", "no"));
    el = new XElement("root");
    //el = new XElement("root");
    XComment comment = new XComment("Log the error count and error message");
    doc.Add(comment);
}
else
{
    doc = XDocument.Load(path);
}
XElement p1 = new XElement("ErrData");
XElement p1Count = new XElement("Count", eventCount);
XElement p1Windowsatrt = new XElement("Timestamp", windowStart);

p1.Add(p1Count );
p1.Add(p1Windowsatrt );

if (doc.Root != null)
{
    el = doc.Root;
    el.Add(p1);
}
else
{
    el = new XElement("root");
    el.Add(p1);
}


try
{
    doc.Add(el);//Line throwing the exeception

}
catch (Exception e)
{

}
finally
{
    doc.Save(path);
}

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

<root /> допустимый XML для тега без содержимого (самозакрывающиеся теги).Если вам абсолютно необходим открывающий и закрывающий тег, вам нужно поместить некоторый контент в корневой узел, например комментарий или текст.

1 голос
/ 21 ноября 2011

Беспорядок в вашем первом предложении: «Я пытаюсь удалить все узлы / элементы из файла XML». Который из них? Вы хотите удалить все узлы или все элементы?

В XML существует пять типов узлов: элементы, текст, комментарии, инструкции по обработке и атрибуты. Если вы будете использовать «узел» и «элемент» взаимозаменяемо, как вы здесь, у вас не будет никаких проблем при работе с XML.

То, что вы получили, <root/>, является правильным выводом для кода, который удаляет все узлы-потомки: это единственный элемент с именем root без содержимого.

Что вы ожидаете,

<root>
</root>

- это единственный элемент с именем root, который содержит дочерний текстовый узел, содержащий пробелы, возможно, новую строку. Код, который вы написали, удаляет все узлы-потомки, а не только узлы-потомки element , и поэтому также удалил этот текстовый узел.

1 голос
/ 21 ноября 2011

Использование docs.Root.Nodes().Remove().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...