搜索XML以查找项列表

时间:2014-09-08 15:44:40

标签: c# xml .net-2.0

我有一个xml doc:

<?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 = Fruit这样的术语,并返回Fruit Items列表。

这是我到目前为止开始的不完整代码:

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

2 个答案:

答案 0 :(得分:1)

我建议阅读有关XPath的内容,因为您只限于.NET 2.0,而且即使在更一般的上下文中(不仅限于.NET平台),XPath对于使用XML也非常有用。

在这种特殊情况下,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>的{​​{1}}节点等于<Name>

答案 1 :(得分:0)

你走在正确的道路上。但是,您需要加载&#39;类别&#39;首先是节点,然后你可以得到它的子节点。

我添加了一个过滤器,只返回名称为&#34; Fruit&#34;的节点。

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
}