2014-09-08 4 views
1

Je dispose d'un document XML en tant que tel:Recherche par XML pour trouver une liste d'éléments

<?xml version="1.0" encoding="utf-8" ?> 
<Categories> 
    <Category> 
    <Name>Fruit</Name> 
    <Items> 
     <Item>Apple</Item> 
     <Item>Banana</Item> 
     <Item>Peach</Item> 
     <Item>Strawberry</Item> 
    </Items> 
    </Category> 
    <Category> 
    <Name>Vegetable</Name> 
    <Items> 
     <Item>Carrots</Item> 
     <Item>Beets</Item> 
     <Item>Green Beans</Item> 
     <Item>Bell Pepper</Item> 
    </Items> 
    </Category> 
    <Category> 
    <Name>Seafood</Name> 
    <Items> 
     <Item>Crab</Item> 
     <Item>Lobster</Item> 
     <Item>Shrimp</Item> 
     <Item>Oysters</Item> 
     <Item>Salmon</Item> 
    </Items> 
    </Category> 
</Categories> 

Je voudrais être en mesure de lancer une recherche sur un terme tel que Category.Name = fruits et retourner la liste des articles de fruits.

Voici le code incomplet j'ai commencé à ce jour:

string localPath = Server.MapPath("~/App_Data/Foods.xml"); 
XmlDocument doc = new XmlDocument(); 
doc.Load(localPath); 
XmlNodeList list = doc.SelectNodes("Categories"); 
//Do something here to search the category names and get back the list of items. 

Ceci est ma première tentative d'analyse syntaxique par XML, donc je suis un peu perdu. Remarque: l'application sur laquelle je travaille utilise .Net 2.0

+0

connaissez-vous les sons 'XPATH' comme cela peut être ce que vous pourriez avoir besoin d'utiliser dans votre cas – MethodMan

+0

Je ne suis pas familier avec XPATH, fait-il partie de .Net 2.0? Je suis ouvert à la meilleure solution mais espérais un exemple. – Ben

+0

ici sont 'SO' il y a effectivement des tonnes d'exemples de la façon de rechercher ou itérer un fichier XML .. – MethodMan

Répondre

1

Je vous suggère de lire sur XPath que vous êtes limité à .NET 2.0, XPath est d'ailleurs très utile de travailler avec XML, même dans un contexte plus général (non limité à la plate-forme .NET uniquement).

Dans ce cas particulier, XPath devient utile car la méthode SelectNodes() et SelectSingleNode() accepte la chaîne XPath comme paramètre. Par exemple, pour obtenir tous <Item> qui correspond à la catégorie Nom "Fruit":

string localPath = Server.MapPath("~/App_Data/Foods.xml"); 
XmlDocument doc = new XmlDocument(); 
doc.Load(localPath); 
XmlNodeList items = doc.SelectNodes("Categories/Category[Name='Fruit']/Items/Item"); 
foreach(XmlNode item in items) 
{ 
    Console.WriteLine(item.InnerText); 
} 

Vous pouvez voir XPath comme un chemin, similaire au fichier chemin dans l'explorateur Windows. Je vais essayer d'expliquer que le bit qui est différent de l'expression de chemin commun dans l'exemple ci-dessus, en particulier ce bit:

...\Category[Name='Fruit']\... 

l'expression entre crochets carrés-est un filtre qui dit rechercher <Category> noeud ayant noeud enfant <Name> est égal à "Fruit".

0

Vous êtes sur la bonne voie. Cependant, vous devez d'abord charger le noeud 'Categories', puis vous pouvez obtenir ses nœuds enfants.

J'ai ajouté un filtre pour renvoyer uniquement les nœuds dont le nom est "Fruit".

XmlNode cat = doc.SelectSingleNode("Categories"); 
var list = cat.SelectNodes("Category").Cast<XmlNode>() 
       .Where(c => c.SelectSingleNode("Name").InnerText == "Fruit"); 

foreach (XmlNode item in list) 
{ 
    // process each node here 
}