Как быстро добраться до подчиненного в XML? - PullRequest
1 голос
/ 26 августа 2010

У меня есть полный XML-файл:

 <machine id="">
  <application id="">
   <fichier name=""/>
   <fichier name=""/>
   <fichier name=""/>
  </application>
  <application id="">
   <fichier name=""/>
   <fichier name=""/>
   <fichier name=""/>
  </application>
 </machine>

Я знаю идентификатор машины и приложения и имя fichier.Прямо сейчас, я сканирую всю машину, затем однажды нашёл, отсканировал приложение и однажды нашел, сканировал фишер.Довольно долго, так как я могу быстро добраться до нужного мне большего?

Ответы [ 3 ]

2 голосов
/ 26 августа 2010

что-то вроде следующего должно работать, предполагая, что вы загрузили XML в XmlDocument с именем xmlDoc:

// load your XML (you may already have this)
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(pathToYourXML);

// construct your XPath
string formattedXPath = string.Format(
    "/machine[@id='{0}']/application[@id='{1}']/fichier[@name='{2}']", 
    machineId, 
    applicationId, 
    fichierName);

// select your node
XmlElement elementFichier = (XmlElement) xmlDoc.SelectSingleNode(formattedXPath)

// if you need the text from this child, use this (text itself is a child node):
string text = elementFichier.FirstChild.Value;

PS: в приведенном выше примере используется XPath, в сети есть несколько учебных пособий (как уже упоминалось другим пользователем), но если вы действительно хотите научиться работать с ним, попробуйте несколько книг Дженни Теннисон по XSLT, она отличный объяснитель.

1 голос
/ 26 августа 2010
0 голосов
/ 26 августа 2010

Вы можете сделать это с помощью LINQ to XML следующим образом:

 var result = from m in xml.Descendants("machine")
             where m.Attribute("id").Value == "1"
              let a = m.Elements("application").Where (x => x.Attribute("id").Value == "3")
              let f = a.Elements("fichier").Where (x => x.Attribute("name").Value == "b")
              select f;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...