2010-04-22 4 views
1

J'ai cette LINQ à l'enquête XML ...LINQ au contenu XML des enregistrements enfants

var Records = from Item in XDoc.Root.Elements("Item") 
       where (string)Item.Element("ItemNumber") == item.ID.ToString 
       select Item; 

... où ItemNumber est un numéro de référence utilisé dans le fichier XML, (à l'origine écrit par ce programme, mais manuellement modifié par "autres"), et item.ID est la version de la base de données de la même chose. La requête exécute, et je peux tester le nombre d'entrées dans le beau résultat ...

if (Records.Count() < 1) 

... vous voyez l'idée. J'ai établi qu'il n'y a qu'un seul enregistrement, (l'éditeur n'a pas supprimé ou dupliqué/multiplié l'article).

Chaque élément a plusieurs champs enfants. Je veux tester les valeurs des champs enfants sont raisonnables avant de les transmettre au sous-système de mise à jour de base de données. Le XML est produit par le programme, mais édité par les utilisateurs, j'ai donc besoin de vraiment vérifier ce qui revient. J'ai donc essayé ...

if (DB_English.ToString() != Records.Elements("English").ToString()) 

... DB_English est de la base de données, mais le XML dans les archives, ne contient pas le contenu de ce champ, il contient ...

System.Xml.Linq.Extensions+<GetElements>d__29`1[System.Xml.Linq.XElement] 

. .. alors, comment puis-je obtenir la valeur de cet élément dans le fichier XML? J'ai besoin de vérifier le champ dans le XML n'a pas été modifié, (les éditeurs manuels de ce fichier de données ne sont pas potentiellement fiables à 100%).

Répondre

0

essayer cette

if (DB_English.ToString() != Records.Elements("English").InnerXML.ToString()) 

Bonté,

Dan

+0

Matin Dan, essayé, le compilateur a lancé cette ... Erreur 'System.Collections.Generic.IEnumerable ' ne contient pas une définition pour 'InnerXml' et aucune méthode d'extension 'InnerXML' acceptant un premier argument de type 'System.Collections.Generic.IEnumerable ' n'a été trouvée (manque-t-il une directive using ou une référence d'assembly?) – Fossaw

0
Records.Elements("English").Value 

Cela vous donnera la valeur du XElement. Mais il ne retournera que du texte. S'il y a html/xml dans la valeur alors cela ne fonctionnera pas et vous devrez écrire une méthode d'extension pour obtenir cette valeur.

Dans ce cas, ce lien devrait aider: http://blogs.msdn.com/ericwhite/archive/2008/12/22/convert-xelement-to-xmlnode-and-convert-xmlnode-to-xelement.aspx

+0

Même type d'erreur comme ci-dessus ... .Value, ou .Value(). Erreur 'System.Collections.Generic.IEnumerable ' ne contient pas de définition pour 'Value' et aucune méthode d'extension 'Value' acceptant un premier argument de type 'System.Collections .Generic.IEnumerable 'peut être trouvé (manque-t-il une directive using ou une référence d'assembly?) – Fossaw

0

J'ai ajouté ce ...

XElement X_EnglishE = null; // This is BLOODY CRAZY 
foreach (XElement i in Records) 
    { 
     X_EnglishE = i.Element("English"); // There is only one damned record! 
    } 
string X_English = X_EnglishE.Value.ToString(); 

... et tester la chaîne X_English résultante. Cela fonctionne mais semble ridicule! Il doit y avoir une meilleure façon.

Questions connexes