Проблемы Linq To Xml с использованием метода Elements (XName) XElement - PullRequest
4 голосов
/ 02 мая 2010

У меня проблема с использованием Linq To Xml.

Простой код. У меня есть этот XML:

<?xml version="1.0" encoding="utf-8" ?>
<data xmlns="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/directory file.xsd">
<contact>
 <name>aaa</name>
 <email>email@email.ext</email>
 <birthdate>2002-09-22</birthdate>
 <telephone>000:000000</telephone>
 <description>Description for this contact</description>
</contact>
<contact>
 <name>sss</name>
 <email>email@email.ext</email>
 <birthdate>2002-09-22</birthdate>
 <telephone>000:000000</telephone>
 <description>Description for this contact</description>
</contact>
<contact>
 <name>bbb</name>
 <email>email@email.ext</email>
 <birthdate>2002-09-22</birthdate>
 <telephone>000:000000</telephone>
 <description>Description for this contact</description>
</contact>
<contact>
 <name>ccc</name>
 <email>email@email.ext</email>
 <birthdate>2002-09-22</birthdate>
 <telephone>000:000000</telephone>
 <description>Description for this contact</description>
</contact>

Я хочу, чтобы каждый контакт отображал его на объекте Контакт. Для этого я использую этот фрагмент кода:

XDocument XDoc = XDocument.Load(System.Web.HttpRuntime.AppDomainAppPath + this.filesource);
XElement XRoot = XDoc.Root;
//XElement XEl = XElement.Load(this.filesource);
var results = from e in XRoot.Elements("contact") 
 select new Contact((string)e.Element("name"), (string)e.Element("email"), "1-1-1", null, null);
List<Contact> cntcts = new List<Contact>();
foreach (Contact cntct in results) {
 cntcts.Add(cntct);
}
Contact[] c = cntcts.ToArray();
// Encapsulating element
Elements<Contact> final = new Elements<Contact>(c);

Хорошо, просто не обращайте на это внимания: сосредоточьтесь на этом:

Когда я получаю корневой узел, все в порядке, я получаю его правильно.

Когда я использую директиву select, я пытаюсь получить каждый узел, говорящий: от e в

XRoot.Elements("contact")

ОК, вот в чем проблема: если я использую: от e в XRoot.Elements (), я получаю все контактные узлы, но если я использую: от e в XRoot.Elements («контакт»), я ПОЛУЧАЮ НИЧЕГО: Пустой SET.

ОК, вы говорите мне: используйте другой: ОК, я делаю ТАК, давайте использовать: from e in XRoot.Elements(), я все равно получаю все узлы, ЭТО ПРАВО, НО ЗДЕСЬ ИДЕТ ДРУГАЯ ПРОБЛЕМА: Когда я говорю: select new Contact((string)e.Element("name"), (string)e.Element("email"), "1-1-1", null, null); Я пытаюсь получить доступ к <name>, <email> ... Я ДОЛЖЕН ИСПОЛЬЗОВАТЬ .Элемент («имя»), И ЭТО НЕ РАБОТАЕТ СЛИШКОМ !!!!!!!! ЧТО ТАКОЕ АД? ????????? Это кажется, что я не совпадаю с именем, которое я прошёл, но как это возможно. Я знаю, что функция Elements () принимает, перегруженный, один аргумент - XName, который отображается на строку. Пожалуйста, учтите, что код, который я написал, взят из примера. Он должен работать.

Ответы [ 2 ]

16 голосов
/ 02 мая 2010

Довольно просто: в игре есть пространство имен XML, которое вы игнорируете:

<data xmlns="http://www.example.com"  
      **************************

Вы должны добавить это к своим запросам Linq-to-XML!

Что-то вроде:

XNamespace ns = "http://www.example.com";

, а затем

XRoot.Elements(ns + "contact") 

и, конечно, также использовать пространство имен XML при доступе к дочерним элементам:

var results = from e in XRoot.Elements("contact") 
              select new Contact(e.Element(ns + "name").Value, 
                                 e.Element(ns + "email").Value, 
                                 "1-1-1", null, null);

Это должно помочь. Дополнительные сведения см. В документации MSDN по Работа с пространствами имен XML .

0 голосов
/ 20 ноября 2015

Для себя я решил это так, потому что в моем XML не было пространства имен:

xmldoc.Root.Elements("contact");

Я забыл использовать метод "Root".

...