在C#中提取XML内部节点元素

时间:2014-04-22 19:14:20

标签: c# xml

我有一个XML文档,如下所示:

<root>
  <key>
    <id>v1</id>
    <val>v2</val>
    <iv>v3</iv>
  </key>
</root>

如何使用C#中的v2值提取v3节点的key值和v1值?

3 个答案:

答案 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;
    }
}