Linq/XML 查询有问题
Problems with Linq/XML query
所以我有这个 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 且等级元素为“*”的交易元素,或类型元素为 2 且等级元素的交易元素介于 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);
但它似乎不喜欢我这样做的方式。我正在寻找有关如何实现所要求结果的一些建议。谢谢!
您可能错过的主要事情是,首先您必须获取文档的所有后代元素。假设我们想从文档的根元素开始查询,下面的代码应该可以工作。
这部分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();
}
}
所以我有这个 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 且等级元素为“*”的交易元素,或类型元素为 2 且等级元素的交易元素介于 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);
但它似乎不喜欢我这样做的方式。我正在寻找有关如何实现所要求结果的一些建议。谢谢!
您可能错过的主要事情是,首先您必须获取文档的所有后代元素。假设我们想从文档的根元素开始查询,下面的代码应该可以工作。
这部分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();
}
}