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

本文关键字:内部节点 元素 XML 提取 | 更新日期: 2023-09-27 17:59:20

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

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

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

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

使用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 
        });
    }  

当然,如果需要,您需要检查缺少的元素等。

使用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

我喜欢使用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;
    }
}