Обход XML с использованием XML-документа

#c# #.net #xml

#c# #.net #xml

Вопрос:

У меня есть следующий код, который я использую для обхода XML:

 private void btn_readXML_Click(object sender, EventArgs e)
{
        var doc = new XmlDocument();
        doc.Load("e:\contacts.xml");
        // Load xml document.            
        TraverseNodes(doc.ChildNodes);     
}

static List<string> xmlnodes = new List<string>();
private static void TraverseNodes(XmlNodeList nodes)
{     
       foreach (XmlNode node in nodes)
       {                   
              List<string> temp = new List<string>();                  
              temp.Add("Node name: "   node.Name.ToString());
              XmlAttributeCollection xmlAttributes = node.Attributes;

              foreach (XmlAttribute at in xmlAttributes)
              {
                   temp.Add("  Atrib: "   at.Name   ": "   at.Value);
              }

               xmlnodes.AddRange(temp);
               TraverseNodes(node.ChildNodes);     
}
 

Но моя проблема в том, что я не хочу просматривать весь документ, я хочу только просмотреть узел, а затем его дочерние элементы, у которых есть атрибут ‘X’. Пожалуйста, обратите внимание, что я не знаю, где присутствует узел. Итак, в основном, что мне нужно сделать, это выяснить, существует ли узел (у него будет атрибут ‘X’. Вот как я определяю его правильный узел) если да, то извлеките его дочерние элементы.

Кто-нибудь может мне здесь помочь? Я довольно новичок в XMLS. Заранее спасибо!

Комментарии:

1. Вы знаете XPath ? Вы могли бы использовать SelectSingleNode или SelectNodes класса XmlDocument.

2. Я не уверен, что знаю XPath полностью, но я попробовал его фрагмент. Я не знаю, где находится узел. Я не могу указать такой путь.

3. Я обновил ответ. Вы можете выбрать все элементы в документе, имеющие атрибут X .

Ответ №1:

Предполагая, что ваш XML имеет следующую структуру:

 <Contacts>
   <Contact X="abc">
       <Child1></Child1>
   </Contact>

   <Contact X="def">
       <Child2></Child2>
   </Contact>
</Contacts>
 

Пример кода с использованием XmlNode.SelectNodes:

 var doc = new XmlDocument();
doc.Load("e:\contacts.xml");

//get root element of document   
XmlElement root = doc.DocumentElement;
//select all contact element having attribute X
XmlNodeList nodeList = root.SelectNodes("//Contact[@X]");
//loop through the nodelist
foreach (XmlNode xNode in nodeList)
{       
    //traverse all childs of the node
}
 

Для различных запросов XPath см. Эту ссылку.

Обновить:

Если вы хотите выбрать все элементы, имеющие атрибут X в документе. Неважно, где они существуют. Вы могли бы использовать следующее:

 //select all elements in the doucment having attribute X
XmlNodeList nodeList = root.SelectNodes("//*[@X]");
 

Комментарии:

1. Да, все в порядке. Есть ли способ, которым я могу сделать что-то вроде: XmlNodeList NodeList = root . SelectNodes(«//Contact[@X]»)==»Y»; Я имею в виду, что здесь я даю имя атрибута. Могу ли я выбрать по значению атрибута?

2. root.SelectNodes("//Contact[@X='Y']"); вы можете сделать так.

Ответ №2:

Попробуйте это:

 private void btn_readXML_Click(object sender, EventArgs e)
{
        var doc = new XmlDocument();
        doc.Load("e:\contacts.xml");

        var nodes = xdoc.SelectNodes("//yournodename");
        // ex. 
        // var nodes = xdoc.SelectNodes("//Company");
        TraverseNodes(nodes);   
}