Я только что столкнулся с проблемой, когда мой код нормально разбирал xml, но как только я добавил второй узел, он начал загружать неверные данные.Настоящий код охватывает несколько классов и проектов, но для примера я собрал основы того, что вызывает проблему
Когда код будет запущен, я ожидаю, что вывод будет содержимым второй задачиузел, но вместо этого выводится содержимое первого узла.Он продолжает извлекать данные из первого вхождения узла EmailAddresses, несмотря на то, что при проверке объекта настроек его внутренний XML-код совпадает со вторым узлом Задачи.При вызове SelectSingleNode("//EmailAddresses")
возникает проблема.
У меня есть два пути решения этой проблемы
- Удалите косые черты из выражения XPath EmailAddresses
- Вызов
Clone()
после получения узла Задача или Настройки
Решение 1 в этом случае работает, но я считаю, что это приведет к тому, что другой код в моем проекте перестанет работать.
Решение 2 выглядит болеедля меня это скорее хак, чем реальное решение.
Мой вопрос: действительно ли я делаю это правильно, и есть ошибка в .NET (все версии), или я просто неправильно извлекаю XML?
код c #
var doc = new XmlDocument();
doc.Load(@"D:\temp\Sample.xml");
var tasks = doc.SelectSingleNode("Server/Tasks");
foreach (XmlNode threadNode in tasks.ChildNodes)
{
if (threadNode.Name.ToLower() != "thread")
{
continue;
}
foreach (XmlNode taskNode in threadNode.ChildNodes)
{
if (taskNode.Name.ToLower() != "task" || taskNode.Attributes["name"].Value != "task 1")
{
continue;
}
var settings = taskNode.SelectSingleNode("Settings");
var emails = settings.SelectSingleNode("//EmailAddresses");
Console.WriteLine(emails.InnerText);
}
}
XML
<?xml version="1.0"?>
<Server>
<Tasks>
<Thread>
<Task name="task 2">
<Settings>
<EmailAddresses>task 2 data</EmailAddresses>
</Settings>
</Task>
</Thread>
<Thread>
<Task name="task 1">
<Settings>
<EmailAddresses>task 1 data</EmailAddresses>
</Settings>
</Task>
</Thread>
</Tasks>
</Server>