如何使用LINQ从XML中选择记录?

时间:2015-03-17 14:09:32

标签: c# xml linq

我有一份XML文档。

<checksum>
    <kbbest>
        <delimiter value="length" offset="0">2</delimiter>
        <record name="header">
            <identificators>
                <identificator value="char('2')" offset="0">HO</identificator>
                <identificator value="char('2')" offset="0">HE</identificator>
            </identificators>
            <fields>
                <!-- some fields -->
            </fields>
        </record>
        <record name="footer">
            <identificators>
                <identificator value="char('2')" offset="0">TO</identificator>
                <identificator value="char('2')" offset="0">TF</identificator>
            </identificators>
            <fields>
                <!-- some fields -->
            </fields>
            </record>
    </kbbest>
</checksum>

我想根据识别器选择存储在记录中的所有信息。 我的剧本:

string recordType = "HE"
IEnumerable<XElement> rec = null;
rec = from xr in doc.Element(fileType).Elements("record")
      where (string)xr.Element("identificators").Element("identificator") == recordType
      select xr;

错误:此选择只能查找具有标识符HO或TO的记录。

如果我尝试将其写为列表

string recordType = "HE"
IEnumerable<XElement> rec = null;
rec = from xr in doc.Element(fileType).Elements("record")
      where xr.Element("identificators").Elements("identificator").Cast<String>().Contains(recordType)
      select xr;

错误:无法将XElement强制转换为String

1 个答案:

答案 0 :(得分:0)

我相信这就是你想要的

string recordType = "HE"
IEnumerable<XElement> rec = null;
rec = from xr in doc.Element(fileType).Descendants ("record")
      where xr.Element("identificators")
              .Elements("identificator")
              .Any(x => x.Value == recordType)
      select xr;

您需要使用Descendants来获取任何超过一个级别的元素。然后,您必须将Value的{​​{1}}与字符串值进行比较。