我有一个XML文档,如下所示:
<root>
<key>
<id>v1</id>
<val>v2</val>
<iv>v3</iv>
</key>
</root>
如何使用C#中的v2
值提取v3
节点的key
值和v1
值?
答案 0 :(得分:3)
使用Linq。
var myXml = XDocument.Parse("<root>
<key>
<id>v1</id>
<val>v2</val>
<iv>v3</iv>
</key>
</root>").Root.Elements("key")
.FirstOrDefault(x=> x.Element("id").Value == value);
if (myXml != null)
{
var myObject = new
{
id = myXml.Element("id").Value,
val = myXml.Element("val").Value,
iv = myXml.Element("iv").Value
});
}
当然,如果需要,您需要检查缺失的元素等。
答案 1 :(得分:1)
使用xpath:
/root/key[id='v1']/val
/root/key[id='v1']/iv
类似
myXmlDoc.SelectSingleNode("/root/key[id='v1']/val").Value
myXmlDoc.SelectSingleNode("/root/key[id='v1']/iv").Value
答案 2 :(得分:0)
我喜欢使用LINQ to XML来处理XML:
var xml = XElement.Parse(@"<root>
<key>
<id>v1</id>
<val>v2</val>
<iv>v3</iv>
</key>
</root>");
var key = xml.Elements("key").First(x => x.Element("id").Value == "v1");
Console.WriteLine("val: " + key.Element("val").Value);
Console.WriteLine(" iv: " + key.Element("iv").Value);
为简洁起见,我忽略了所有错误检查。
例如,如果找不到该元素, First() 会抛出异常。您可能希望使用 FirstOrDefault() 并检查 null ,如果您期望或更优雅地处理边缘情况。
Element() 电话也是如此。他们可能会返回 null ,因此调用 .Value 可能会导致 System.NullReferenceException 。为了避免混乱,我通常使用扩展方法来进行这些检查:
static class XElementUtilities
{
public static string GetValue(this XElement xml, string name)
{
var element = xml.Element(name);
return element == null ? null : element.Value;
}
public static bool ValueEqual(this XElement xml, string name, string value)
{
var element = xml.Element(name);
return element != null && value != null && element.Value == value;
}
}