我有一个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
答案 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
}