2014-02-21 2 views
0

У меня есть следующий XML:Как перемещаться все дети теги в XML-структуры

<VON> 
     <OverXP name="UML1" > 
      <Property name="actor1" value="1" /> 
      <OverXP name="UML2" > 
       <Property name="actor2" value="2" />  
      </OverXP> 
     </OverXP> 
    </VON> 

мне нужно каждый все атрибуты, как дерево: результат должен выглядеть так:

ровном1: actor1 = 1 level2: actor2 = 2

мой код:

XPathNavigator nav; 
XPathDocument docNav; 
XPathNodeIterator NodeIter; 
String strExpression; 
// Open the XML. 
docNav = new XPathDocument(@"C:\uml.xml"); 
// Create a navigator to query with XPath. 
nav = docNav.CreateNavigator(); 
strExpression = "//OverXP//*"; 
NodeIter = nav.Select(strExpression); 

, но не работает!

+0

Я не вижу 'Overview' элемент в XML ... – Athari

+0

Я обновил его: OverXP –

ответ

0

Вы проверяете строковый узел на значение атрибута в @name/string(), что является неправильным и не может быть выполнено. В XPATH вам не нужно явно указывать тип, как в объектно-ориентированном коде, есть только значения результата, типы которых вы будете обрабатывать на уровне C#. string() используется для возврата только символов значений желаемого результата.

Таким образом, использовать что-то более, как //OverXP [@name= 'UML2']

Но от взглядов своего желаемого результата, вы можете захотеть использовать как так: //OverXP[contains(@name, 'UML')], но это даст вам некоторые из результатов более чем один раз, так что вы может добавить [1] в запрос или уточнить его, чтобы быть более конкретным для того, что вы хотели бы видеть.

+0

мне нужно получить все дети –

+0

Это доставит вам всех детей, вы попробовали? Я не слишком уверен, какой результат вы хотели бы вернуть с помощью 'level1: actor1 = 1 level2: actor2 = 2', XPath возвращает фрагмент XML или значения внутри. Если вы можете предоставить пример части XML, которую вы используете, я могу обновить свой ответ. – JWiley

0

Вот запрос, который использует LINQ синтаксис запроса что я считаю, получите результаты, которые вы хотите:

XDocument document = XDocument.Parse(xmlContent); 

var query = 
    from property in 
     document.Descendants("OverXP").Elements("Property") 
    select new 
    { 
     Level = property.Ancestors().Count() - 1, 
     Actor = (string)property.Attribute("name"), 
     Value = (string)property.Attribute("value") 
    }; 

я включил данные выборки и этот запрос в демонстрационной программе. Ниже вы найдете отформатированный результат демонстрационной программы, за которой следует сама программа.

Ожидаемый результат

[Level 1] => [actor1 = 1] 
[Level 2] => [actor2 = 2] 

Демонстрационная программа

using System; 
using System.Linq; 
using System.Xml; 
using System.Xml.Linq; 

class LinqToXmlDemo 
{ 
    static public void Main(string[] args) 
    { 
     var xmlContent = GetXml(); 
     XDocument document = XDocument.Parse(xmlContent); 

     var query = 
      from property in 
       document.Descendants("OverXP").Elements("Property") 
      select new 
      { 
       Level = property.Ancestors().Count() - 1, 
       Actor = (string)property.Attribute("name"), 
       Value = (string)property.Attribute("value") 
      }; 

     foreach (var item in query) 
     { 
      Console.WriteLine("[Level {0}] => [{1} = {2}]", 
           item.Level, item.Actor, item.Value); 
     } 
    } 

    static string GetXml() 
    { 
     return 
      @"<VON> 
       <OverXP name='UML1'> 
        <Property name='actor1' value='1' /> 
        <OverXP name='UML2'> 
         <Property name='actor2' value='2' /> 
        </OverXP> 
       </OverXP> 
       </VON>"; 
    } 
} 
Смежные вопросы