2012-02-07 60 views
3

我有一個xml消息,我需要解析(無格式控制),看起來像下面的(名稱/值對),我需要處理。查詢Name = x並獲取相關值的值的最佳方法是什麼?在C#中查詢XML的最佳方式 - 使用LINQ等

我目前正在使用嵌套select來嘗試從特定的名稱/值對中獲取值。只是想知道是否可以使用更簡單的LINQ/Lambda調用。

任何建議,將不勝感激。

<Message> 
<MessageContent> 
    <MessageDetails> 
    <Name>System_ID</Name> 
    <Value>12345</Value> 
    </MessageDetails> 
    <MessageDetails> 
    <Name>System_Name</Name> 
    <Value>Test System</Value> 
    </MessageDetails> 
</MessageContent> 
</Message> 

回答

7

使用LINQ到XML:

var xml = XElement.Load(someXmlFile); 
var results = xml.Descendants("MessageDetails") 
       .Where(m => m.Element("Name").Value == someValue) 
       .Select(m => m.Element("Value").Value); 

如果您希望只有一個匹配添加FirstOrDefault()拿到第一個匹配值。

看你的XML,它看起來像你也可以從投影到字典中獲益(如果你Name元素值是唯一的):

var dictionary = xml.Descendants("MessageDetails") 
        .ToDictionary(x => x.Element("Name").Value, 
            x => x.Element("Value").Value); 

現在你可以使用字典:

string value = dictionary["System_ID"]; 
+0

感謝@BrokenGlass我會看看感謝您的答覆 – scarpacci 2012-02-07 02:41:00

+0

爲什麼在計算器上的每一個答案,使用LINQ到XML涉及'.Descendants' ?爲什麼遞歸搜索整個文檔中的元素時,他們被認爲是根元素的子元素?只是想知道...... – dtb 2012-02-07 02:41:22

+0

@dtb:這是一個公正的批評 - 它更容易/更短的原型,並減少對你的XML結構的假設,但對於大型XML文檔,這將有所作爲 – BrokenGlass 2012-02-07 03:03:01

0

如果您無法控制格式,並且將來可能會更改,我也會考慮using XPath,因此您可以使用較少的代碼更改來修改您的選擇。例如,XPath來獲取系統ID是:

 
//MessageContent/MessageDetails[Name='System_Name']/Value