根据属性id搜索并获取XML节点的所有子节点

时间:2017-12-08 03:21:15

标签: c# xml linq

我有一个这样的示例XML:

<doc>
    <customer id="1">
      <first>
        <fullname>John Doe 1</fullname>
        <contact>011-1111111</contact>
        <title>Lorem</title>
      </first>
      <second>
        <fullname>John Doe 2</fullname>
        <contact>012-2222222</contact>
        <title>Lorem</title>
      </second>
    </customer>       
</doc>

我的问题是如何根据客户ID将所有子节点放在第一个和第二个内部。到目前为止,这是我尝试过但我不知道如何继续它。

 XDocument doc = XDocument.Load("sampleXML.xml");
 var controls = from str in doc.Elements("customer")
                           where str.Attribute("id").Value == 1
                           select str;

如果我能够获取数据,我该如何显示结果?通过使用foreach循环?对不起,如果这是一个愚蠢的问题,但我对c#和linq很新。

3 个答案:

答案 0 :(得分:2)

您可以使用XElement.Load("xmlPath")加载xml,并根据属性获取筛选出的所有客户元素。循环遍历每个节点并打印。

        XElement xelement = XElement.Load("sampleXml.xml");
        var customers = xelement.Elements("customer").FirstOrDefault(x => x.Attribute("id").Value == "1");
        foreach (XElement customer in customers.Nodes())
        {
            var fullName = customer.Element("fullname").Value;
            var contact = customer.Element("contact").Value;
            var title = customer.Element("title").Value;
        }

答案 1 :(得分:1)

您可以使用以下代码获取first代码中的信息。

var first = doc.Root.Elements("customer").Elements("first").Elements();

答案 2 :(得分:0)

您可以使用xpath查找具有属性值的元素。

这是一个例子

    string xml= "your xml string";
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    var nodes = doc.SelectSingleNode("/doc/customer[@id='1']").ChildNodes;