Как изменить значение нескольких тегов в xml-файле?
Имеется XML-файл, как изменить несколько значений тега "newval"?
Пытался таким образом, но ничего не вышло.
<?xml version="1.0" encoding="utf-8"?>
<config>
<root>
<saveparam>
<idx>PRESSURE</idx>
<newval>3.01</newval>
</saveparam>
<saveparam>
<idx>TEMPERATURE</idx>
<newval>38.43</newval>
</saveparam>
<saveparam>
<idx>COUNT</idx>
<newval>5</newval>
</saveparam>
<saveparam>
<idx>FLOW_R</idx>
<newval>150.124</newval>
</saveparam>
<saveparam>
<idx>FLOW_N</idx>
<newval>0.000</newval>
</saveparam>
<saveparam>
<idx>RATE</idx>
<newval>10</newval>
</saveparam>
</root>
</config>
XmlDocument document = new XmlDocument();
document.Load("C:/stack.xml");
XPathNavigator navigator = document.CreateNavigator();
foreach (XPathNavigator nav in navigator.Select("//root"))
{
string value = nav.GetAttribute("idx", "");
if (value == "PRESSURE")
{
nav.MoveToFollowing("newval", "");
nav.SetValue("10");
}
if (value == "TEMPERATURE")
{
nav.MoveToFollowing("newval", "");
nav.SetValue("45");
}
if (value == "COUNT")
{
nav.MoveToFollowing("newval", "");
nav.SetValue("3");
}
}
document.Save("C://stack.xml");
Ответы (1 шт):
Используя путь //root вы получаете, как неудивительно, элементы с именем root. То есть один-единственный элемент. А вам нужно пройтись по нескольким элементам saveparam. Для этого используем путь //root/saveparam или //saveparam (самый короткий) или /config/root/saveparam (самый быстрый). Я бы использовал последний, так как использование // (descendants) на больших документах может работать катастрофически медленно.
GetAttribute возвращает атрибут. В вашем документе нет ни одного атрибута! Учите формат xml и другие форматы данных (json, csv, yaml и пр.)! Потому что без этого никак! Потому что stackoverflow наводнён однотипными вопросами по парсингу xml (и других текстовых форматов), в которых вопрошающие путают элементарные понятия.
foreach (XPathNavigator nav in navigator.Select("/config/root/saveparam"))
{
string idx = nav.SelectSingleNode("idx").Value;
if (idx == "PRESSURE")
{
nav.MoveToFollowing("newval", "");
nav.SetValue("10");
}
if (idx == "TEMPERATURE")
{
nav.MoveToFollowing("newval", "");
nav.SetValue("45");
}
if (idx == "COUNT")
{
nav.MoveToFollowing("newval", "");
nav.SetValue("3");
}
}
Это рабочий код с минимальными изменениями.