需要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例子,因为它的结构让我感到困惑。请帮忙!
有许多技术可以让你访问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;
祝您好运!
非常感谢!然而,这个解决方案不符合我的目的。首先,事实上,xml结构是固定的,我无法改变它。其次,我需要BVALUE2,因为它是名为'B'的密钥的值。在我的示例xml的上下文中,我向第3行提供了“// dict [key ='XYZ'] // dict [key ='B'] // string”,但它不会给我BVALUE2。相反,它给了我一些CVALUE2(其中CVALUE2的类型也是字符串,并且在文档中出现在BVALUE2之前,与BVALUE2在同一水平上)。 – 2012-08-03 12:14:10
@Nirav,你的查询返回多个结果,SelectSingleNode将返回第一个匹配的结果。问题是XML的结构不会让你想出一个简单的查询。你可以写这个查询:// key [text()='KEYVALUE2']/following :: node()/ key [ text()='B']/following :: node()/ text(),但你看到它不是那么好 – 2012-08-03 12:37:33
你也可以使用SelectNodes方法迭代节点。 – 2012-08-03 12:44:08
有没有机会通过使用键/值对元素来改进您的XML结构?依靠键和值的交错是相对讨厌的... – 2012-08-03 09:36:02
你是什么意思与“字典与KEYVALUE2”?您示例中的KEYVALUE2字典与KEYVALUE1字典相同。有一个词典有2个键(和一些其他元素),它们是KEYVALUE1和KEYVALUE2。 – Bazzz 2012-08-03 09:36:34