使用Linq查询从XML获取值

时间:2016-05-22 12:29:46

标签: c# asp.net xml linq

我有以下XML文件。

<Root>
  <r1>
    <n1>Person1</n1>
    <n2>Type1</n2>
  </r1>
  <r1>
    <n1>Person1</n1>
    <n2>Type2</n2>
  </r1>
  <r1>
    <n1>Person2</n1>
    <n2>Type2</n2>
  </r1>
  <r1>
    <n1>Person2</n1>
    <n2>Type3</n2>
  </r1>
  <r1>
    <n1>Person2</n1>
    <n2>Type4</n2>
  </r1>
  <r1>
    <n1>Person2</n1>
    <n2>Type4</n2>
  </r1>
</Root>

我想要的是根据人物获取类型。例如,我尝试下面的查询期望person1的Type1和Type2值,但它不起作用。

XDocument doc = XDocument.Parse(XML_Document);

XElement[] pages = doc
    .Descendants("r1")
    .OrderBy(x => x.FirstNode.Value=="person1")
    .ToArray();

我应该使用哪个查询来获取它?或者是否有更好的方法来处理asp.net C#中的XML文档?

3 个答案:

答案 0 :(得分:2)

您可以使用Where()r1子元素值过滤n1,然后使用Select()返回相应的n2元素值:

string[] types = doc.Descendants("r1")
                     .Where(x => (string)x.Element("n1") == "person1")
                     .Select(x => (string)x.Element("n2"))
                     .ToArray();

如果您想明确删除重复值,请在Distinct()之后添加Select()

答案 1 :(得分:2)

尝试使用下面的where语句,它会给你两个xelements

        XElement[] pages = doc.Descendants("r1")
                              .Where(x => x.Element("n1").Value == "Person1")
                              .ToArray();

答案 2 :(得分:1)

尝试使用以下代码:

var pages = doc.
            Descendants("r1").
            Where(r1 => r1.Element("n1").Value == "person1").
            Select(r1 => r1.Element("n2").Value).
            ToArray();