0
votes

Linq dynamique à XML

J'essaie d'utiliser Dynamic Linq Expressions a > avec Linq à XML , mais avoir des problèmes avec des paramètres dynamiques.

Voici un exemple de requête de Dynamic Linq Wiki: p> xxx pré>

dans mon cas, par exemple, j'essaie d'interroger la structure suivante: p>

var query = XmlSource.Elements()
         .AsQueryable()
         .Select("new (FirstAttribute.Value as IP, FirstNode.toString() as OS)");


4 commentaires

Gee Merci pour le vocal et le vote rapproché. Quelle gentillesse de ta part.


Qu'essayez-vous d'accéder? Il n'y a pas besoin de asquerisable ici.


@ Daniela.white Dynamic Linq Expressions construites sur le dessus de IQuerisable autant que je sache. J'essaie d'exécuter des questions sur des champs arbitraires fournis par l'utilisateur. J'ai ajouté l'exemple de Dynamic Linq Wiki.


@ Daniela.La réponse ci-dessous par Netmage est exactement ce que je demandais. Désolé d'être incertain.


3 Réponses :


0
votes

Pour récupérer l'attribut et l'élément décroissant, vous pouvez essayer ci-dessous le code:

string StringXML = @"<DataCenter>
                       <Server IP='1.2.3.4'>
                           <OS>Windows</OS>
                       </Server>
                       <Server IP='5.6.7.8'>
                           <OS>Linux</OS>
                       </Server>
                    </DataCenter>";


XDocument Doc = XDocument.Parse(StringXML);

var nodess = from Servers in Doc.Descendants("Server")
                select new{IP = Servers.Attribute("IP").Value , OS=Servers.Element("OS").Value} ;

foreach(var node in nodess)
{
    Console.WriteLine("ServerIP:"+node.IP + " ServerOS:" +node.OS);
}


1 commentaires

Merci, mais Sélectionnez doit être dynamique, je ne sais pas à l'avance quels éléments / attributs seront demandés



0
votes
XDocument doc2 = XDocument.Parse(xml);
var results = from s in doc2.Descendants("Server") select new { OsName = s.Element("OS").Value, IpAddress = s.Attribute("IP").Value };

2 commentaires

J'utilise Dynamic Linq, je ne sais pas à l'avance quelle sera la condition ou les champs demandés. Si vous jetez un coup d'œil à l'exemple au bas de mes paramètres post-paramètres, des chaînes peuvent être construites


J'ai édité à mon post. Comme il est XML et que nous voulons les valeurs des éléments / attributs, pourquoi ne pas simplement saisir la valeur.



4
votes

supposant que vous utilisez system.linq.dynamic.core , vous pouvez ajouter xname et xelement sur les types accessibles < / em> ils vont donc fonctionner: xxx

puisque la linq dynamique n'utilise pas les conversions implicites pour la recherche de méthode et ne comprend pas les conversions explicites, j'ai montré deux façons différentes de gérer la conversion de < Code> chaîne à xName normalement effectué par la conversion implicite: xxx

si cela est possible pour l'élément OS Pour être manquant, vous devez tester pour null . Malheureusement, je n'ai pas pu obtenir le prédicat np au travail: xxx


5 commentaires

Tu es un génie! Cela fonctionne comme un charme. J'ai 2 questions cependant: une: pourquoi nous passons un nom différemment à l'attribut et élément? Ou ça ne fait pas une différence sur laquelle nous convertissons la chaîne en xname? Et seconde - si l'attribut n'existe pas, je reçois NullReferenceException. Quel serait le meilleur endroit pour ajouter des sauvegardes à vérifier NULL? Merci!


@YuriyGalantter Je les ai transmises différemment pour montrer des moyens possibles de résoudre le manque de soutien de conversion implicite ou explicite dans Dynamic Linq. Utilisez ce que vous préférez.


@YuriyGalantter J'ai étendu ma réponse à l'élément manquant.


J'espère que vous pourrez m'aider avec un autre problème. Je peux exécuter avec succès la requête Dynamic Linq, mais lorsque j'essaie d'exporter des résultats à CSV à l'aide de cette méthode ( Hanselman .com / blog / ... ) Il est passé comme iSenumerable de type "objet" pour sorcière getProperties () ne renvoie rien. Existe-t-il un moyen d'énumérer les propriétés de l'article renvoyées par Dynamic Linq?


NM, je l'ai eu, merci!