Question

J'ai une collection de données stockées dans XDocuments et DataTables, et j'aimerais les aborder comme un seul espace de données unifié avec des requêtes XPath. Ainsi, par exemple, "/ Root / Tables / Orders / FirstName". chercherait la valeur de la colonne Prénom dans chaque ligne du DataTable nommée "Commandes".

Y a-t-il un moyen de faire cela sans copier tous les enregistrements du DataTable dans le XDocument?

J'utilise .Net 3.5

Était-ce utile?

La solution 2

J'ai finalement trouvé la réponse à cette question moi-même. J'ai découvert une classe dans System.Xml.LINQ appelée XStreamingElement qui peut créer une structure XML à la volée à partir d'une expression LINQ. Voici un exemple de conversion d'un DataTable dans un espace XML.

Dictionary<string,DataTable> Tables = new Dictionary<string,DataTable>();
// ... populate dictionary of tables ...
XElement TableRoot = new XStreamingElement("Tables",
    from t in Tables
    select new XStreamingElement(t.Key,
               from DataRow r in t.Value.Rows
               select new XStreamingElement("row",
                          from DataColumn c in t.Value.Columns
                          select new XElement(c.ColumnName, r[c])))))

Le résultat est un XElement (TableRoot) avec une structure similaire à la suivante, en supposant que le dictionnaire contienne une table appelée "Commandes". avec deux rangées.

<Tables>
    <Orders>
        <row>
            <sku>12345</sku>
            <quantity>2</quantity>
            <price>5.95</price>
        </row>
        <row>
            <sku>54321</sku>
            <quantity>3</quantity>
            <price>2.95</price>
        </row>
    </Orders>
</Tables>

Peut être fusionné avec une hiérarchie plus grande basée sur XElement / XDocument et interrogé avec XPath.

Autres conseils

Le .NETs XPath fonctionne sur l'interface IXPathNavigable. Chaque IXPathNavigable a une méthode CreateNavigator () qui renvoie un IXPathNavigator.

Pour exposer toutes vos sources de données en un seul document volumineux, vous devez créer une classe implémentant IXPathNavigable, contenant toutes les sources de données xpath. La méthode CreateNavigator doit renvoyer un XPathNavigator personnalisé qui expose le contenu sous la forme d'une source de données volumineuse.

Malheureusement, la mise en oeuvre de ce navigateur est quelque peu fastidieuse et vous devez faire particulièrement attention lorsque vous passez d'un document à un autre,

Cherchez-vous quelque chose de similaire à ce que j'ai demandé concernant Clés étrangères XPath ?

Comme le dit la recommandation XPath, "L'objectif principal de XPath est d'adresser des parties d'un document XML." Il n'a aucune possibilité d'adresser des parties de plus d'un document XML. Vous devrez créer un seul document XML si vous voulez faire ce que vous essayez de faire.

Vous devez fusionner vos documents ou au moins effectuer les mêmes transformations sur tous vos documents. Vous pouvez envisager de déplacer vos documents vers un seul DataTable, puis de filtrer le DataTable si XPath / XSLT n’est pas réalisable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top