2012-08-03 25 views
1

我有一個複雜的結構xml,我需要從中讀取一些元素值。 我的XML是有點像這樣:需要C#解決方案來讀取xml元素值

<plist version="1.0"> 
<dict> 
<key>XYZ</key> 
<dict> 
    <key>KEYVALUE1</key> 
    <dict> 
     <key>A</key> 
     <date>AVALUE1</date> 
     <key>B</key> 
     <string>BVALUE1</string>    
    </dict> 
    <key>KEYVALUE2</key> 
    <dict> 
     <key>A</key> 
     <date>AVALUE2</date> 
     <key>B</key> 
     <string>BVALUE2</string>  
     <key>C</key> 
     <string>CVALUE2</string>   
    </dict> 
</dict> 
</dict> 
</plist> 

我需要的是:搜索與KEYVALUE2的字典,何地我明白了,挑BVALUE2出來的(你可以用任何數字代替2,我剛纔包括2節點爲了簡潔)。

我是xml編程的新手,我所有嘗試使用MS文檔的嘗試都讓我更困惑。有時我會發現一個xmlreader例子,它並不完全符合我的目的,而其他時候我得到了LINQ例子,因爲它的結構讓我感到困惑。請幫忙!

+2

有沒有機會通過使用鍵/值對元素來改進您的XML結構?依靠鍵和值的交錯是相對討厭的... – 2012-08-03 09:36:02

+0

你是什麼意思與「字典與KEYVALUE2」?您示例中的KEYVALUE2字典與KEYVALUE1字典相同。有一個詞典有2個鍵(和一些其他元素),它們是KEYVALUE1和KEYVALUE2。 – Bazzz 2012-08-03 09:36:34

回答

3

有許多技術可以讓你訪問XML。
由於LINQ是不是你的口味,你可以做到以下幾點:
使用XmlDocument的使用XPath,如下面的例子:

XmlDocument xmldoc = new XmlDocument(); 
xmlDoc.LoadXml(xml); 
string bvalue = xmlDoc.SelectSingleNode("//dict[key='" + key + "']/dict/string).InnerText; 

但我會建議先改變你的XML的結構..
XML是一個很好的關係數據結構。您的鍵的排列方式是不相關的。在我看來,應該是在這樣每個級別一個關鍵:

<dict>  
    <KeyValuePair> 
     <key type="date">A</key>   
     <value>AVALUE2</value> 
    </KeyValuePair> 
    <KeyValuePair> 
     <key type="string">B</key>   
     <value>BVALUE2</value>    
    </KeyValuePair>   
</dict> 

這樣,你可以寫:

string value = xmlDoc.SelectSingleNode("//KeyValuePair[key = 'B']/value").InnerText; 

祝您好運!

+0

非常感謝!然而,這個解決方案不符合我的目的。首先,事實上,xml結構是固定的,我無法改變它。其次,我需要BVALUE2,因爲它是名爲'B'的密鑰的值。在我的示例xml的上下文中,我向第3行提供了「// dict [key ='XYZ'] // dict [key ='B'] // string」,但它不會給我BVALUE2。相反,它給了我一些CVALUE2(其中CVALUE2的類型也是字符串,並且在文檔中出現在BVALUE2之前,與BVALUE2在同一水平上)。 – 2012-08-03 12:14:10

+0

@Nirav,你的查詢返回多個結果,SelectSingleNode將返回第一個匹配的結果。問題是XML的結構不會讓你想出一個簡單的查詢。你可以寫這個查詢:// key [text()='KEYVALUE2']/following :: node()/ key [ text()='B']/following :: node()/ text(),但你看到它不是那麼好 – 2012-08-03 12:37:33

+0

你也可以使用SelectNodes方法迭代節點。 – 2012-08-03 12:44:08