2013-05-20 4 views
0

J'ai un fichier xml. Ceci est juste morceau de ce fichierComment vérifier si le nœud de texte du fichier xml contient un nœud enfant et y récupère toutes les données?

1 <mainTerm> 
2  <title> Abandonment </title> 
3  <see> Maltreatment </see> 
4 </mainTerm> 
5 <mainTerm> 
6  <title> Abasia <nemod>(-astasia) (hysterical) </nemod></title> 
7  <code>F44.4</code> 
8 </mainTerm> 

J'ai beaucoup de boucle <mainTerm> et je par chacun d'eux. Je copie toutes les données des éléments, mais quand j'atteins la ligne 6, j'ai eu le problème. Comment copier tout ce contenu? J'ai besoin d'obtenir la chaîne de fin, qui ressemblera à "Abasia (-astasia) (hystérique)".

C'est la pièce de mon application qui fonctionne avec ce fichier

 List<string> nodes = new List<string>(); 

      //Create XmlReaderSettings object 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.IgnoreWhitespace = true; 
      settings.IgnoreComments = true; 

      //Create XmlReader object 
      XmlReader xmlIn = XmlReader.Create(path, settings); 

      Excel.Application xlApp; 
      Excel.Workbook xlWorkBook; 
      Excel.Worksheet xlWorkSheet; 
      object misValue = System.Reflection.Missing.Value; 

      xlApp = new Excel.Application(); 
      xlWorkBook = xlApp.Workbooks.Add(misValue); 
if (xmlIn.ReadToDescendant("mainTerm")) 
{ 
do 
{ 
    xmlIn.ReadStartElement("mainTerm");             

    nodes.Add(xmlIn.ReadElementContentAsString());       

    nodes.Add(xmlIn.ReadElementContentAsString());       

} while (xmlIn.ReadToNextSibling("mainTerm")); 
} 
+0

Faites attention à l'utilisation de "nœud de texte". Un nœud de texte est un type spécifique de nœud XML qui ne peut contenir que des données de caractères. Je pense que vous voulez dire que mainTerm a un "contenu mixte", c'est-à-dire des données et des éléments de caractères. –

+0

mettre à jour la question avec votre code – Damith

+0

Oui, je veux dire "contenu mixte", mais comment puis-je obtenir toutes les données de contenu mixte pour obtenir le résultat "Abasia (-astasia) (hystérique)". " – Bryuk

Répondre

1

Vous pouvez utiliser LINQ2XML. Il suffit de terminer votre structure XML dans un nœud racine et chercher tous les éléments de titre comme celui-ci:

var xmlSrc = @"<?xml version=""1.0"" encoding=""UTF-8""?><xml><mainTerm> 
    <title> Abandonment </title> 
    <see> Maltreatment </see> 
</mainTerm> 
<mainTerm> 
    <title> Abasia <nemod>(-astasia) (hysterical) </nemod></title> 
    <code>F44.4</code> 
</mainTerm></xml>"; 

var xml = XDocument.Parse(xmlSrc); 
var mainTerms = xml.Root.Elements("mainTerm").ToList(); 
var titles = mainTerms.Elements("title").ToList(); 
foreach (var title in titles) 
{ 
    System.Console.WriteLine(title.Value); 
} 

La sortie est:

Abandonment 
Abasia (-astasia) (hysterical) 

C'est à mon humble avis beaucoup plus facile que XPath et XmlReader.


Utilisation de la fonction Descendants votre mainTerm élément n'a pas besoin d'être l'élément racine:

var mainTerms = xml.Root.Descendants("mainTerm").ToList(); 

Cette ligne offre tout de mainTerm à tous les niveaux du document XML!

+0

Oui, c'est facile, mais J'ai xml fichier avec des milliers de noeuds et n'est même pas l'élément racine Mon xmlReader fonctionne bien, sauf élément comme dans mon exemple ... Tout ce dont j'ai besoin de son correctif – Bryuk

+0

J'ai étendu ma réponse avec un exemple de code qui récupère tous mainTerm's indépendamment de la position de l'élément dans XML – pasty

+0

Ok. Merci, je vais essayer ça. – Bryuk

0

Vous devez utiliser XmlDocument. Je trouve que l'utiliser est beaucoup plus facile que xmlreader. en utilisant votre exemple ...

1 <mainTerm> 
2  <title> Abandonment </title> 
3  <see> Maltreatment </see> 
4 </mainTerm> 
5 <mainTerm> 
6  <title> Abasia <nemod>(-astasia) (hysterical) </nemod></title> 
7  <code>F44.4</code> 
8 </mainTerm> 

quelque chose comme ça (Désolé, n'a pas eu le temps d'exécuter ce par un compilateur ... Mais c'est l'idée générale)

XmlDocument example = new XmlDocument(); 

example.Load(StringWhereYouHaveYourXML); //You can also load Xml in other ways... check documentation 

XmlNodeList mainTerm = example.SelectNodes("/mainTerm/"); //Now you have your list of Mainterms... 
//Check for children in your nodes now... 
forEach(XmlNode a in mainTerm){ 
    //check in the Title node for children that is 
    XmlNode title = a.SelectSingleNode("/Title/"); 
    if (title.HasChildNodes){ 
     XmlNode abasia = title.SelectSingleNode("/nemod/"); 
    } 
} 

de Là, vous pouvez faire ce que vous voulez avec le nœud. Mais vous l'avez maintenant défini plus concrètement.

Questions connexes