如何使用动态linq解析xml数据

时间:2015-07-22 18:25:13

标签: c# xml linq dynamic-linq

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

IndexOf(":")

但是收到错误“XElement”类型(索引0处)中没有属性或字段“OrderID”

这是我的样本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;

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

<?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>

1 个答案:

答案 0 :(得分:2)

您收到错误的原因是XML tags are case sensitive

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

  

XML标记区分大小写。标签&lt;订单&gt;与标记&lt; orders&gt;不同。

您的查询正在搜索不存在的元素&#34; orders&#34;。更新您的查询:

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

更新:

根据您的评论,错误实际上是根据&#34; OrderID&#34;在IEnumerabe<XElement>内。 &#34; OrderID&#34;实际上是每个XElement的子元素。

对此进行更多研究可能会有所帮助。在谷歌搜索的帮助下,我的结果显示System.Linq.Dynamic库不是为与XML一起使用而设计的。

请参阅OP总结的SO Question

  

我终于开始工作了。我放弃了原来的方法,因为到目前为止我并不相信它甚至打算用于Xml。我发现在任何地方都没有发表任何反对该声明的论据。

如何将XML读入DataSet?

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;