如何选择特定的xmlnode并更改其值

时间:2018-03-21 18:11:49

标签: c# xml

我的xml看起来像这样......

<?xml version="1.0" encoding="utf-8"?>
<messwerte>
<messwert>
  <tag>1</tag>
  <niederschlag>46</niederschlag>
  <temperatur>7,6</temperatur>
  <druck>4,6</druck>
</messwert>
......
</messwerte>

现在,我想给一个特定的日子,我想改变“niederschlag”“Temperatur”和“druck”,我尝试了这个:

 public static void WriteXML(int day, double[] mess, string path)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(path);
           XmlElement nieder = doc.SelectSingleNode("/messwerte/messwert" + Convert.ToString(day) + "/niederschlag") as XmlElement;
           if (nieder != null)
           {
               nieder.InnerText = Convert.ToString(mess[0]);
           }
        }

它不会工作。 我知道这是baaaad和超级基本但我不能让它工作.......

1 个答案:

答案 0 :(得分:0)

我会建议它不适合你的原因,你是不是想用一个xpath字符串做两件不同的事情。
首先,您必须找到messwert元素,其中tag元素的InnerText值与您传入的day值相匹配。
一旦确定了正确的元素,就要更改niederschlag元素的InnerText。

尽管写出来看起来很复杂,但利用LINQ查询可以极大地简化它:

public static void WriteXML(int day, double[] mess, string path)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(path);
    var nieder = (from XmlElement element in doc.GetElementsByTagName("messwert")
                         where element.SelectSingleNode("tag").InnerText == day.ToString()
                         select element).First().SelectSingleNode("niederschlag");
    if (nieder != null)
    {
        nieder.InnerText = mess[0].ToString();
    }
    doc.Save(path);
}

此代码假设您的数据受到严格控制,并且您永远不会在寻找那些不存在的日子。

如果不是这种情况,则必须将包含First()方法的查询分配给临时变量,并检查它是否为空。

这样的事情应该有效:

public static void WriteXML(int day, double[] mess, string path)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(path);
    var messwert = (from XmlElement element in doc.GetElementsByTagName("messwert")
                    where element.SelectSingleNode("tag").InnerText == day.ToString()
                    select element).FirstOrDefault();
    if(messwert == null)
    {
        throw new ArgumentException($"The day value, doesn't exist.  the value passed is {day}");
    }
    var nieder = messwert.SelectSingleNode("niederschlag");
    if (nieder != null)
    {
        nieder.InnerText = mess[0].ToString();
    }
    doc.Save(path);
}