2009-10-02 11 views
1
<?xml version="1.0" encoding="ISO-8859-1"?> 
<bookstore> 
    <book category="COOKING"> 
    <title lang="en">Everyday Italian</title> 
    <author>Giada De Laurentiis</author>  
    <year>2005</year> 
    <price>30.00</price> 
    </book> 

    <book category="CHILDREN"> 
    <title lang="en">Harry Potter</title> 
    <author>J K. Rowling</author> 
    <year>2005</year> 
    <price>29.99</price> 
    </book> 

    <book category="WEB"> 
    <title lang="en">XQuery Kick Start</title> 
    <author>James McGovern</author> 
    <author>Per Bothner</author> 
    <author>Kurt Cagle</author> 
    <author>James Linn</author> 
    <author>Vaidyanathan Nagarajan</author> 
    <year>2003</year> 
    <price>49.99</price> 
    </book> 

    <book category="WEB"> 
    <title lang="en">Learning XML</title> 
    <author>Erik T. Ray</author> 
    <year>2003</year> 
    <price>39.95</price> 
    </book> 

</bookstore> 

Leur aucune façon à l'aide XPath pour sélectionner l'ensemble du premier noeud complet, par exemple deC# Comment extraire le noeud XML complet mis

<book category="COOKING"> 
    to 
</book>, 

de telle sorte que, ce morceau de XML peut être stocké pour plus tard utilisation.

Bob.

Répondre

3

Supposons que ce fichier XML soit stocké dans un XmlDocument appelé doc.

XmlElement docRoot = doc.DocumentElement; 
XmlNode cookingNode = docRoot.SelectSingleNode("./book[@category='COOKING']"); 

J'ai testé cela et a ajouté cette ligne pour vérifier:

Console.WriteLine(cookingNode.OuterXml); 

Voici était la sortie:

<book category="COOKING"><title lang="en">Everyday Italian</title><author>Giada 
De Laurentiis</author><year>2005</year><price>30.00</price></book> 
+0

Merci Dan. Bob. –

1

Cette requête sélectionnera ce noeud. Essayez-vous d'obtenir un ensemble de nœuds ou juste le seul? Vous devrez peut-être replacer le nœud de la librairie si vous ne voulez que le sous-ensemble de nœuds.

/bookstore/book[@category='COOKING'] 

comme XmlDocument ...

var x = new XmlDocument(); 
x.Load("XmlFile1.xml"); 
var ns = x.SelectSingleNode("/bookstore/book[@category='COOKING']"); 

var res = ns.OuterXml; 

comme XDocument ...

var x = XDocument.Load("XmlFile1.xml"); 

var root = new XElement("bookstore", 
    from book in x.Element("bookstore").Elements("book") 
    where book.Attribute("category").Value == "COOKING" 
    select book 
    ); 

si vous voulez juste le nœud livre que vous pouvez le faire au lieu de la version racine ci-dessus

var book = x.Element("bookstore") 
    .Elements("book") 
    .Where(n => n.Attribute("category").Value == "COOKING") 
    .First(); 
+0

Je l'ai essayé. Cela ne fait que ramener le "NOEUD DE CUISSON". Ce que je veux, c'est ramener tout ce qui se trouve dans ce bloc particulier de à ...

+0

Je lis des messages xml qui arrivent dans un tube de message. J'ai besoin de stocker des parties spécifiques d'entre eux, de sorte que ces parties peuvent être construites dans un nouveau message composite, essentiellement une demande/réponse. J'ai donc besoin d'un moyen de choisir des morceaux sélectionnés de xml à partir des messages entrants à utiliser à une date ultérieure pour construire le message de réponse. –

+0

Je reçois le noeud entier avec SelectNode et SelectSingleNode. Les classes Xml.Linq fonctionnent de la même manière. –

0

Ajouter à Matthew's res ponse:

XmlDocument xDoc = new XmlDocument(); 
// (Put code to populate xDoc here) 
XmlNodeList xNode = xDoc.SelectNodes(@"/bookstore/book[@category='COOKING']"); 

xNode est maintenant égal à Book of type COOKING.

+0

Je pense que cela vous donnera un 'XmlNodeList' plutôt qu'un' XmlNode'. –

+0

Ouais ... vous devrez obtenir le premier index ou utiliser SelectSingleNode –

1

suppose que je veux extraire uniquement les données oùla fichier xml est la suivante ..

<book category="COOKING"> 
    <title lang="en">Everyday Italian</title> 
    <author auth="up">Giada De Laurentiis</author>  
    <year>2005</year> 
    <price>30.00</price> 
    </book> 

le résultat final sur la vue de la liste devrait ressembler à ceci

lang  auth 
    en   up 

je codé comme suit ..

XmlNodeList elemList = doc.GetElementsByTagName("book"); 
        for (int j = 0; j < elemList.Count; j++) 
        { 
         if (elemList[j].Attributes["category"].Value == "COOKING") 
         { 
          XmlNodeList elemList1 = doc.GetElementsByTagName("author"); 
          for (int i = 0; i < elemList1.Count; i++) 
          { 
           string attrVal = elemList1[i].Attributes["lang"].Value; 
           string attrVal1 = elemList1[i].Attributes["auth"].Value; 

           ListViewItem lvi = new ListViewItem(); 

            lvi.SubItems.Add(attrVal1); 
            lvi.SubItems.Add(attrVal1); 
           } 
           listView1.Items.Add(lvi); 
          } 
         } 
        } 
+0

enfin j'ai le code pour l'exigence que j'avais .. 'XmlDocument xDoc = new XmlDocument(); // (Place le code pour remplir xDoc ici) XmlNodeList xNode = xDoc.SelectNodes (@ "/ librairie/livre [@ category = 'CUISSON']/titre"); ' – Gifted

Questions connexes