2012-05-25 1 views
0

Я пытаюсь извлечь определенные значения из XML-документа. В приведенном ниже примере я хочу сохранить значения, хранящиеся в узлах «c» и «d» в списке, но только там, где узел «b» содержит как «c», так и «d». Код, который я до сих пор прокручивает все узлы «b», но я не уверен, что положить в цикл while, или если это лучший подход.Как извлечь дочерние узлы из XML-файла с помощью XPath, когда должны существовать оба дочерних узла?

XmlDocument attrsXML = new XmlDocument(); 
attrsXML.LoadXml(dbReader["SampleXml"].ToString()); 

XPathNavigator nav = attrsXML.CreateNavigator(); 

XPathNodeIterator attribNodes = nav.Select("https://stackoverflow.com/a/b"); 

while (attribNodes.MoveNext()) 
{ 
    // What do I need to put here in order to extract the 'c' and 'd' nodes? 
    // Any other nodes can be ignored (such as 'e' above). I am only interested 
    // when 'b' contains both 'c' AND 'd'. 
} 

Где SampleXml "загружается из базы данных:

<a> 
    <b> 
     <c>Extract this</c> 
     <d>And this</d> 
     <e>not this</e> 
    </b> 
    <b> 
     <c>not this</c> 
     <e>not this</e> 
    </b> 
    <b> 
     <c>Extract this</c> 
     <d>And this</d> 
    </b> 
</a> 

Любая помощь приветствуется.

ответ

3

Вы можете использовать следующий код:

XmlDocument attrsXML = new XmlDocument(); 
attrsXML.LoadXml(dbReader["SampleXml"].ToString()); 


XmlNodeList nodeList = attrsXML.SelectNodes("https://stackoverflow.com/a/b[c and d]"); 

foreach (XmlNode xmlNode in nodeList) 
{ 
    string cText = xmlNode.SelectSingleNode("c").InnerText; 
    string dText = xmlNode.SelectSingleNode("d").InnerText; 
} 

XPath «/ а/б [с и d]» возвращает все б элементы, которые содержат с и d элементы, как дети, а значит, вы не необходимо проверить его внутри цикла вручную.

+0

Спасибо eminsenay - я перешел на использование вашего решения. Очень приятно, чем мое! – psych

0

Я решил это так:

while (attribNodes.MoveNext()) 
{ 
    string cText = String.Empty; 
    string dText = String.Empty; 

    XPathNavigator nav2 = attribNodes.Current; 

    var cNode = nav2.SelectSingleNode("c"); 

    if (cNode != null) 
    { 
     cText = nameNode.ToString(); 

     var dNode = nav2.SelectSingleNode("d"); 
     if (dNode != null) 
     { 
      dText = dNode.ToString(); 
     } 
    } 

    if (dText != String.Empty && cText != String.Empty) 
    { 
     // Problem solved 
    } 
} 

Добро пожаловать все лучшие решения, как это, кажется, не очень элегантно.

 Смежные вопросы

  • Нет связанных вопросов^_^