簡體   English   中英

如何選擇特定的xmlnode並更改其值

[英]How do I select a specific xmlnode and change it values

我的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和超級基礎的,但是我無法使它工作。

我建議它對您不起作用的原因是,您正在嘗試使用一個xpath字符串執行2種不同的操作。
首先,您必須找到帶有tag元素的messwert元素,該元素的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()方法的查詢分配給臨時變量,並檢查其是否為null。

這樣的事情應該起作用:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM