Linq/XML 查询问题

Problems with Linq/XML query

提问人:mayo0o 提问时间:4/20/2022 最后编辑:mayo0o 更新时间:4/20/2022 访问量:51

问:

所以我有这个XML文件:

<student_update date="2022-04-17" program="PMM" checksum="20021621">
    <transaction>
        <program>PMM</program>
        <student_no>10010800</student_no>
        <course_no>*</course_no>
        <registration_no>111</registration_no>
        <type>2</type>
        <grade>100</grade>
        <notes>Update Grade Test</notes>
    </transaction>
    <transaction>
        <program>PMM</program>
        <student_no>10010821</student_no>
        <course_no>M-50033</course_no>
        <registration_no>*</registration_no>
        <type>1</type>
        <grade>*</grade>
        <notes>Register Course Test</notes>
    </transaction>
</student_update>

我正在尝试对它运行一个查询,其中结果集应该只包含类型元素为 1 且 grade 元素为“*”的事务元素,或者其类型元素为 2 且 grade 元素介于 0 和 100 之间(含)。

到目前为止,我想出的查询是这样的:

XDocument xDocument = XDocument.Load(inputFileName);

  XElement root = xDocument.Element("student_update");

   IEnumerable<XElement> transactionElements = xDocument.Descendants().Where(x => x.Name == "transaction");

    IEnumerable<XElement> gradeForCourseElement = numTypeElement.Where(x => Int32.Parse(x.Element("type").Value) == 1 && x.Element("grade").Value == "*" ||
                                                                       Int32.Parse(x.Element("type").Value) == 2 && Int32.Parse(x.Element("grade").Value) <= 100);

但它似乎不喜欢我这样做的方式。我正在寻找一些关于如何实现所要求结果的建议。谢谢!

C# .NET Linq-to-XML

评论

0赞 jdweng 4/20/2022
您不需要使用值。代替 : (int)x.Element(“type”) == 2

答:

0赞 Pavel Koryakin 4/20/2022 #1

您可能错过的主要事情是,首先您必须获取文档的所有 descendand 元素。假设我们想从文档的根元素进行查询,下面的代码应该可以工作。

这部分必须写得更仔细。int.Parse(_.Element("grade")?.Value) <= 100

var xml = "%your xml goes here%";

using (var textReader = new StringReader(xml))
{
    using (var xmlTextReader = new XmlTextReader(textReader))
    {
        var xDoc = XDocument.Load(xmlTextReader);
        var result = xDoc.Descendants()
            .Where(_ => _.Name.LocalName == "transaction"
            &&
            (
                _.Element("type")?.Value == "1" && _.Element("grade")?.Value == "*"
                 ||
                 _.Element("type")?.Value == "2" && int.Parse(_.Element("grade")?.Value) <= 100
            )
            )
            .ToList();
    }
}

评论

0赞 mayo0o 4/20/2022
你好帕维尔,谢谢你的帮助。我忘了在上面的代码中添加文档的根元素,但是我已经用您要查找的内容对其进行了更新。你解释的代码很有意义,我很感激!