2015-07-22 1 views
0

je suis en train de lire un fichier xml et l'interrogation par LINQ cette façon ci-dessousComment analyser les données XML avec LINQ dynamique

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; 

mais erreur est survenue lors Aucune propriété ou un champ « OrderID » existe dans le type « XElement » (à l'index 0)

ceci est mon exemple xml que je suis interrogation par 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> 

j'ai utilisé cette requête, mais ci-dessous toujours pas de chance

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

Avez-vous essayé document.root.Descendants (« Commandes ») – Kevin

+0

@ w.b i utilisé lien dynamique et il ce genre de commande par clause est valide. – Thomas

Répondre

2

La raison pour laquelle vous obtenez l'erreur est parce que XML tags are case sensitive.

Un extrait du lien (modifié pour correspondre à l'exemple dans votre question):

balises XML sont sensibles à la casse. L'étiquette <Commandes> est différent de l'étiquette <commandes>.

Votre requête recherche l'élément inexistant "orders". Mettez à jour votre requête:

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

MISE À JOUR:

Sur la base de vos commentaires, l'erreur est en fait ancré dans la tentative de commander par « OrderID » au IEnumerabe<XElement>. Le "OrderID" est en fait un élément enfant de chaque XElement.

Mener d'autres recherches sur ce sujet serait probablement utile. Avec l'aide de google search, mes résultats montrent que la bibliothèque System.Linq.Dynamic n'a pas été conçue pour être utilisée avec XML.

Voir ce SO Question où l'OP conclut:

Je suis enfin fonctionner. J'ai abandonné mon approche originale car pour le moment je ne suis pas convaincu qu'il était même destiné à être utilisé avec Xml. J'ai vu peu posté n'importe où pour argumenter contre cette déclaration.

Qu'en est-il de la lecture du code XML dans un 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; 
+0

désolé c'était le type que j'ai utilisé Commandes pas commandes mais toujours eu erreur – Thomas

+0

voir le dernier code où string.format a été utilisé dans l'ordre par la clause – Thomas

+0

Il serait utile à tous si vous avez mis à jour votre question pour refléter vos commentaires ici. –