2015-03-20 2 views
0

Есть ли способ уменьшить код foreach ниже, поэтому мне не нужно использовать цикл foreach для итерации по узлам xml?Поиск в XmlNodeList для определенной строки

Я просто хочу, чтобы смотреть и видеть, если элемент присутствует в файле 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

Что именно вы пытаетесь сделать? Сделайте что-нибудь для ** каждого ** XmlNode с конкретным InnerText или только одним? – cubrr

+0

Вы можете использовать делегатов ... –

ответ

2

Если все, что вам нужно сделать, это проверить, существует ли определенный узел, используйте SelectSingleNode с filtere d XPath:

XmlNode node = doc.SelectSingleNode("/MyList/item[. = 'blah blah']"); 
if (node != null) 
{ 
    // do something 
} 

Одна проблема здесь в том, что, если значение, которое вы хотите, чтобы соответствовать на это динамическое значение, вы не должны наращивать XPath путем конкатенации строк вместе. Это создаст недопустимый XPath.

В этом случае, вы можете использовать LINQ на XmlNodeList:

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"); 
2

Вы можете фильтровать элемент внутреннего текст непосредственно в выражении XPath, как так:

XmlNodeList list = doc.SelectNodes("/MyList/item[.='blah blah']"); 
Смежные вопросы