2014-09-08 3 views
1

У меня есть XML-документ как таковой:Поиск по XML, чтобы найти список элементов

<?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> 

Я хотел бы быть в состоянии искать на такой термин, как Category.Name = фрукты и получить обратно список из фруктовых предметов.

Вот неполный код, который я начал до сих пор:

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. 

Это моя первая попытка разбора через XML, так что я немного потерял. Примечание: приложение, над которым я работаю, использует .Net 2.0

+0

Вы знакомы с звуками 'XPATH', как это может быть, что вам может понадобиться в вашем случае – MethodMan

+0

Я не знаком с XPATH, это часть .Net 2.0? Я открыт для лучшего решения, но надеялся на пример. – Ben

+0

здесь 'SO' есть на самом деле множество примеров того, как искать или перебирать XML-файл. – MethodMan

ответ

1

Я хотел бы предложить, чтобы прочитать о XPath, как вы ограничены .NET 2.0, кроме того, XPath очень полезен для работы с XML, даже в более общем контексте (не ограничиваясь платформы .NET только).

В этом конкретном случае XPath становится полезным, потому что метод SelectNodes() и SelectSingleNode() принимает параметр XPath в качестве параметра. Например, чтобы получить все <Item>, что соответствует категории имени "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); 
} 

Вы можете увидеть XPath как путь, похожий на путь к файлу в Windows. Я бы попытаться объяснить только бит, который отличается от обычного выражения пути в приведенном выше примере, в частности, этот бит:

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

выражение в квадратных скобках представляет собой фильтр, который говорит, поиск <Category> узла, имеющий дочерний узел <Name> соответствует "Fruit".

0

Вы на правильном пути. Однако сначала вам нужно будет сначала загрузить узел «Категории», затем вы можете получить его дочерние узлы.

Я добавил фильтр, чтобы возвращать только узлы, где имя «Фрукты».

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 
}