2011-06-03 3 views
2

est-il un moyen d'obtenir le InnerText d'un nœud lorsque le nœud se trouve dans une collection j'ai actuellement ceGet InnerText de Collection

Collection<string> DependentNodes = new Collection<string>(); 
foreach (XmlNode node in nodes) 
{ 
    for (int i = 0; i < node.ChildNodes.Count; i++) 
    { 
    DependentNodes.Add(node.ChildNodes[i].InnerXml); 
    //the reason i'm using InnerXml is that it will return all the child node of testfixture in one single line,then we can find the category & check if there's dependson 
    } 
} 
    string selectedtestcase = "abc_somewords"; 
    foreach (string s in DependentNodes) 
    { 
     if(s.Contains(selectedtestcase)) 
     { 
     MessageBox.Show("aaa"); 
     } 

    } 

Quand je déboguer chaîne s ou l'indice a ceci à l'intérieur de celui-ci [en une seule ligne]

<testfixture name="1" description="a"> 
    <categories> 
    <category>abc_somewords</category> 
    </categories> 
    <test name="a" description="a"> 
    <dependencies> 
     <dependson typename="dependsonthis" /> 
    </dependencies> 
    </test> 
</testfixture> 

ce que je suis en train de faire est lorsque nous atteignons « TestFixture 1 » il trouvera « abc_somewords » & rechercher le noeud « DependsOn typename » (le cas échéant) et obtenir le " typename "(qui est" dependonthis ").

+0

quel type est 'DependentNodes'? – Stefan

+0

Dependentnode est une collection – someguy

+0

Pouvez-vous utiliser Linq? –

Répondre

3

Pourriez-vous utiliser linq en XML. Quelque chose comme ci-dessous pourrait être un bon départ

xml.Elements("categories").Where(x => x.Element("category").Value.Contains(selectedtestcase)); 

Ceci est du haut de ma tête donc pourrait aura besoin de raffinage

post-scriptum Utilisez XElement.Load ou XElement.Parse pour obtenir votre xml dans XElements

+0

Il veut sortir 'zzzz' –

+0

Ce qui précède retournera le noeud parent donc une fois qu'il a ces derniers il peut utiliser la même technique pour obtenir le noeud de test – NinjaNye

1

Je ne sais pas ce que sont les "nœuds" que vous utilisez.

Voici le code avec vos besoins (Ce que j'ai compris).

Collection<XmlNode> DependentNodes = new Collection<XmlNode>(); 

     XmlDocument xDoc = new XmlDocument(); 

     xDoc.Load(@"Path_Of_Your_xml"); 

     foreach (XmlNode node in xDoc.SelectNodes("testfixture")) // Here I am accessing only root node. Give Xpath if ur requrement is changed 
     { 
      for (int i = 0; i < node.ChildNodes.Count; i++) 
      { 
       DependentNodes.Add(node.ChildNodes[i]); 
      } 
     } 
     string selectedtestcase = "abc_somewords"; 

     foreach (var s in DependentNodes) 
     { 
      if (s.InnerText.Contains(selectedtestcase)) 
      { 
       Console.Write("aaa"); 
      } 
     } 
3

Puisque vous travaillez déjà avec XmlNode vous pouvez utiliser une expression XPath pour sélectionner le nœud textfixture souhaité et sélectionnez la valeur de dépendance:

XmlDocument doc = // ... 
XmlNode node = doc.SelectSingleNode("//testfixture[contains(categories/category, \"abc\")]/test/dependencies/dependson/"); 

if (node != null) 
{ 
    MessageBox.Show(node.Attributes["typename"]); 
} 

Sélectionne le nœud dependson qui appartient à un noeud testfixture avec un category contenant "abc". node.Attributes["typename"] renverra la valeur de l'attribut typename.

Modifié: Mise à jour l'expression XPath à l'information question plus précise

3

Hypothèses

Comme vous Looping dans votre code et vouloir créer une collection Je suppose le fichier Xml réel a plusieurs nœuds testfixture à l'intérieur tels que l'exemple supposé ci-dessous:

<root> 
    <testfixture name="1" description="a"> 
    <categories> 
     <category>abc_somewords</category> 
    </categories> 
    <test name="a" description="a"> 
     <dependencies> 
     <dependson typename="dependsonthis" /> 
     </dependencies> 
    </test> 
    </testfixture> 
    <testfixture name="2" description="a"> 
    <categories> 
     <category>another_value</category> 
    </categories> 
    <test name="b" description="a"> 
     <dependencies> 
     <dependson typename="secondentry" /> 
     </dependencies> 
    </test> 
    </testfixture> 
    <testfixture name="3" description="a"> 
    <categories> 
     <category>abc_somewords</category> 
    </categories> 
    <test name="c" description="a"> 
     <dependencies> 
     <dependson typename="thirdentry" /> 
     </dependencies> 
    </test> 
    </testfixture> 
</root> 

Le code LINQ pour Xml

Pour utiliser LINQ vous devez référencer les espaces de noms suivants:

using System.Linq; 
using System.Xml.Linq; 

LINQ Pour Xml sur la structure du fichier xml supposé ci-dessus ressemblerait à ceci:

// To Load Xml Content from File. 
XDocument doc1 = XDocument.Load(@"C:\MyXml.xml"); 

Collection<string> DependentNodes = new Collection<string>(); 

var results = 
    doc1.Root.Elements("testfixture") 
    .Where(x => x.Element("categories").Element("category").Value.Contains("abc_somewords")) 
    .Elements("test").Elements("dependencies").Elements("dependson").Attributes("typename").ToArray(); 

foreach (XAttribute attribute in results) 
{ 
    DependentNodes.Add(attribute.Value.Trim()); 
} 

Résultat

La collection résultante contiendra les éléments suivants:

enter image description here

Comme vous pouvez le voir, seul le texte de l'attribut typename a été extrait où les dependson noeuds où, en un noeud testfixture qui contenait un noeud category avec la valeur abc_somewords.

Notes additionnelles

Si vous lisez le code XML à partir d'une chaîne, vous pouvez également utiliser:

// To Load Xml Content from a string. 
XDocument doc = XDocument.Parse(myXml); 

Si votre structure complète Xml est différent, vous pouvez Postez-le et je change le code pour correspondre.

Amusez-vous.

+0

J'ai maintenant mis à jour mon code pour correspondre à la structure du fichier xml. J'ai également mis à jour la requête Linq pour extraire la valeur de nom de l'attribut dependson si nécessaire. J'espère que cela vous aidera maintenant. – Nope

1
using System; 
using System.Xml; 

namespace ConsoleApplication6 
{ 
    class Program 
    { 
     private const string XML = "<testfixture name=\"1\" description=\"a\">" + 
          "<categories>" + 
          "<category>abc_somewords</category>" + 
          "</categories>" + 
          "<test name=\"a\" description=\"a\">" + 
          "<dependencies>" + 
          "<dependson typename=\"dependsonthis\" />" + 
          "</dependencies>" + 
          "</test>" + 
          "</testfixture>"; 

     static void Main(string[] args) 
     { 
      var document = new XmlDocument(); 
      document.LoadXml(XML); 

      var testfixture = document.SelectSingleNode("//testfixture[@name = 1]"); 

      var category = testfixture.SelectSingleNode(".//category[contains(text(), 'abc_somewords')]"); 

      if(category != null) 
      { 
       var depends = testfixture.SelectSingleNode("//dependson"); 
       Console.Out.WriteLine(depends.Attributes["typename"].Value); 
      } 


      Console.ReadKey(); 
     } 
    } 
} 

Sortie: dependsonthis