有没有办法可以减少下面的foreach代码,所以我不必使用foreach循环迭代xml节点?
我只想查看xml文件中是否存在项目
XmlDocument doc = new XmlDocument();
doc.Load("MyList.xml");
XmlNodeList list = doc.SelectNodes("/MyList/item");
foreach( XmlNode item in list)
{
string name = item.InnerText;
if(name == "blah blah")
{
//do something
}
}
上述工作,但我只想要一个更小的冷却方式:)
答案 0 :(得分:2)
您可以直接在XPath表达式中按内部文本过滤元素,如下所示:
XmlNodeList list = doc.SelectNodes("/MyList/item[.='blah blah']");
答案 1 :(得分:2)
如果您只想检查某个节点是否存在,请使用带有过滤的XPath的SelectSingleNode
:
XmlNode node = doc.SelectSingleNode("/MyList/item[. = 'blah blah']");
if (node != null)
{
// do something
}
这里的一个问题是,如果要匹配的值是动态值,则不应通过将字符串连接在一起来构建XPath。这会产生无效的XPath。
在这种情况下,您可以在XmlNodeList
上使用LINQ:
var found = doc.SelectSingleNode("/MyList/item")
.Cast<XmlNode>()
.Any(n => n.InnerText == "blah blah");
或继续使用LINQ-to-XML:
XDocument doc = XDocument.Load("MyList.xml");
bool itemFound = doc.Element("MyList")
.Elements("item")
.Any(e => (string) e == "blah blah");