2015-08-10 3 views
1

У меня есть файл XML с IP-адресами и назначенных им местах/этажей, который выглядит примерно так:C# и LINQ - Получить имена родительских элементов в XML-запросе

<Locations> 
    <LOCATION1> 
     <FLOOR1> 
     <SECTION1> 
      <IP>10.10.10.10</IP> 
      <IP>etc.... 
     </SECTION1> 
     </FLOOR1> 
    </LOCATION1> 
..... 

То, что я пытаюсь сделать, это получить запрос для IP-адреса и вернуть имена родительских элементов. Я могу запросить этот IP-адрес, но мне не удавалось выяснить, как получить имена родительских элементов (т. Е. РАЗДЕЛ 1, FLOOR1, LOCATION1). Вот код, я использую для запросов XML, чтобы найти IP-адрес, я просто его возвращения значения в данный момент, чтобы проверить мой запрос был успешным:

var query = from t in xmlLocation.Descendants("IP") 
      where t.Value.Equals(sIP) 
      select t.Value; 
+0

'XElement' имеет свойство' Parent ', который ссылается на его родительский элемент. Вы можете использовать его для перемещения дерева до корня. – MarcinJuraszek

+0

Вы ищете '.Ancestors()'. – SLaks

ответ

0
var xDoc = XDocument.Load(filename); 
var ip = xDoc.XPathSelectElement("//IP['10.10.10.10']"); 
var names = ip.Ancestors().Select(a => a.Name.LocalName).ToList(); 

имена будут содержать SECTION1, FLOOR1, LOCATION1, Locations

Если вы знаете, эти названия заранее вы можете также использовать их, чтобы выбрать нужный узел

var ip = xDoc.XPathSelectElement("//LOCATION1/FLOOR1/SECTION1/IP['10.10.10.10']"); 

или

var section = xDoc.XPathSelectElement("//LOCATION1/FLOOR1/SECTION1[IP['10.10.10.10']]"); 
+0

Подумайте, добавьте несколько слов, пояснений, деталей. –

+1

Это сработало отлично, спасибо. Для тех из вас, кто может наткнуться на это, убедитесь, что вы используете «System.Xml.XPath», чтобы получить доступ к XPathSelectElement. – user3645184

1

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

<?xml version="1.0" encoding="utf-8" ?> 
<Locations> 
    <LOCATION1> 
    <FLOOR1> 
     <SECTION1> 
     <IP>10.10.10.10</IP> 
     <IP>20.20.20.20</IP> 
     </SECTION1> 
    </FLOOR1> 
    <FLOOR2> 
     <SECTION1> 
     <IP>30.30.30.30</IP> 
     <IP>40.40.40.40</IP> 
     </SECTION1> 
    </FLOOR2> 
    </LOCATION1> 
</Locations > 

​ 

Код

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      var results = doc.Descendants("LOCATION1").Elements().Select(x => new 
      { 
       parent = x.Name.ToString(), 
       ip = x.Descendants("IP").Select(y => (string)y).ToList() 
      }).ToList(); 

     } 
    } 

} 
​ 

ниже код получает местоположение, пол, и раздел

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      var results = doc.Descendants("Locations").Elements().Select(x => x.Elements().Select(y => y.Elements().Select(z => new { 
       location = x.Name.ToString(), 
       floor = y.Name.ToString(), 
       section = z.Name.ToString(), 
       ip = z.Descendants("IP").Select(i => (string)i).ToList() 
      })).SelectMany(a => a)).SelectMany(b => b).ToList(); 

     } 
    } 

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