2014-12-05 2 views
0

Использование LINQ to XML.Получение данных из файла XML

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

<?xml version="1.0" encoding="utf-8"?> 
<TileMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Title>title</Title> 
    <Abstract>Some clever text about this.</Abstract> 
    <SRS>OSGEO:41001</SRS> 
    <Profile>global-mercator or something</Profile> 
</TileMap> 

я могу извлечь <Title> от этого без каких-либо проблем, используя этот маленький кусочек кода:

string xmlString = AppDomain.CurrentDomain.BaseDirectory + @"Capabilities\" + name + ".xml"; 
string xmlText = File.ReadAllText(xmlString); 
byte[] buffer = Encoding.UTF8.GetBytes(xmlText); 
XElement element = XElement.Load(xmlString); 
IEnumerable<XElement> title = 
          from el in element.Elements("Title") 
          select el; 
foreach (XElement el in title) 
{ 
    var elementValue = el.Value; 
} 

Однако, это ISN 't очень гибко, потому что, скажем, у меня есть XML-файл, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<RootObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Services> 
    <TileMapService> 
     <Title>title</Title> 
     <href>http://localhost/root</href> 
    </TileMapService> 
    </Services> 
</RootObject> 

Не может найти <Title>, но он находит <Services> (предположим), но так как он не называется «Название», он просто игнорирует его. Я не очень силен в работе с XML. Как я могу сделать метод, который просматривает XML и выбирает мне «Title», или же вы его реализуете?

+0

код, который вы не отвечал бы на самом деле компиляции, так как вы объявляя 'element' локальную переменную дважды ... –

+0

Хах, даже не заметил, что , Мое имя переменной было глупо, поэтому я изменил его в редакторе SO, прежде чем опубликовать его. Я отредактировал его. – Khaine775

ответ

1

Изменить запрос LINQ к:

IEnumerable<XElement> title = 
    from el in element.Descendants("Title") 
    select el; 

Elements возвращает только непосредственные дети, Descendants возвращает все узлы-потомки вместо.

2

В настоящее время вы просто просматриваете дочерние элементы корневого элемента. Если вы хотите найти все потомки, используйте Descendants.

Кроме того, нет смысла использовать выражение запроса from x in y select x (точнее, в некоторых случаях есть пункт, но не здесь). Так просто использовать:

var titles = element.Descendants("Title"); 

Лично я бы на самом деле использовать XDocument здесь, а не XElement - у вас есть все-таки есть целый документ, в комплекте с декларацией XML, не просто элемента.

0

Потомки будут выбирать все элементы «Название» независимо от уровня. Пожалуйста, используйте XPath, чтобы правильно определить местонахождение элемента

using System; 
using System.Linq; 
using System.Xml.Linq; 
using System.Xml.XPath;     
using System.IO; 

public class Program 
{ 
    public static void Main() 
    { 
     string xmlFile = AppDomain.CurrentDomain.BaseDirectory + @"Capabilities\" + name + ".xml"; 
     XElement xml=XElement.Load(xmlFile); 
     IEnumerable<XElement> titleElements = xml.XPathSelectElements("//Services/TileMapService/Title"); 
    } 
} 
Смежные вопросы