需要C#解决方案来读取xml元素值

问题描述:

我有一个复杂的结构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

有许多技术可以让你访问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