如何用动态linq解析xml数据

本文关键字:xml 数据 解析 linq 何用 动态 | 更新日期: 2023-09-27 18:04:10

我正在读取一个xml文件,并通过LINQ查询如下方式

XDocument document = XDocument.Load(xmlFilePath);
var query = document.Descendants("orders").Select(c => c);
query = query.OrderBy(sortColumn + " " + OrderDirection);
query = query.Skip(lowerPageBoundary - 1 * rowsPerPage).Take(rowsPerPage);
DataTable table = query.ToList().ConvertToDataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
//adapter.Fill(table);
return table;

但是得到错误在类型'XElement'(索引0)中没有属性或字段'OrderID'存在

这是我的示例xml,我正在查询LINQ

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Orders>
    <OrderID>10248</OrderID>
    <CustomerID>VINET</CustomerID>
    <EmployeeID>5</EmployeeID>
    <OrderDate>1996-07-04T00:00:00</OrderDate>
    <RequiredDate>1996-08-01T00:00:00</RequiredDate>
    <ShippedDate>1996-07-16T00:00:00</ShippedDate>
    <ShipVia>3</ShipVia>
    <Freight>32.3800</Freight>
    <ShipName>Vins et alcools Chevalier</ShipName>
    <ShipAddress>59 rue de l'Abbaye</ShipAddress>
    <ShipCity>Reims</ShipCity>
    <ShipPostalCode>51100</ShipPostalCode>
    <ShipCountry>France</ShipCountry>
  </Orders>
</Root>

我使用了下面的查询,但仍然没有运气

var query = document.Descendants("orders")
                    .OrderBy(String.Format("Element('"{0}'").Value {1}", sortColumn, OrderDirection))
                    .Skip(lowerPageBoundary - 1 * rowsPerPage)
                    .Take(rowsPerPage);

如何用动态linq解析xml数据

出现错误的原因是XML标记区分大小写。

链接的摘录(修改以匹配你问题中的示例):

XML标记区分大小写。标签与标签不同。

您的查询正在搜索不存在的元素"orders"。更新查询:

XDocument document = XDocument.Load(xmlFilePath);
var query = document.Descendants("Orders").Select(c => c);

更新:

根据你的评论,错误实际上是植根于试图通过"OrderID"在IEnumerabe<XElement>内订购。"OrderID"实际上是每个XElement的子元素。

对此进行更多的研究可能会有所帮助。在google搜索的帮助下,我的结果表明System.Linq.Dynamic库不是为XML而设计的。

见这个SO问题,OP的结论是:

我终于把它修好了。我放弃了最初的方法,因为到目前为止,我甚至不相信它是用于Xml的。我在任何地方都没有看到任何反驳这种说法的帖子。

如何将XML读入数据集?

DataSet dataSet = new DataSet();
dataSet.ReadXml(xmlFilePath);
string sort = sortColumn + " " + OrderDirection;
DataTable table = dataSet.Tables["Orders"].Select("", sort)
                                          .Skip(lowerPageBoundary - 1 * rowsPerPage)
                                          .Take(rowsPerPage)
                                          .CopyToDataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;