2010-05-02 3 views
4

У меня проблема с Linq To Xml.Linq To Xml проблемы с использованием метода XElement Элементы (XName)

Простой код. У меня есть этот 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 protected]</email> 
<birthdate>2002-09-22</birthdate> 
<telephone>000:000000</telephone> 
<description>Description for this contact</description> 
</contact> 
<contact> 
<name>sss</name> 
<email>[email protected]</email> 
<birthdate>2002-09-22</birthdate> 
<telephone>000:000000</telephone> 
<description>Description for this contact</description> 
</contact> 
<contact> 
<name>bbb</name> 
<email>[email protected]</email> 
<birthdate>2002-09-22</birthdate> 
<telephone>000:000000</telephone> 
<description>Description for this contact</description> 
</contact> 
<contact> 
<name>ccc</name> 
<email>[email protected]</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); 

Ok просто не против того, что все: фокус на этом:

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

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

XRoot.Elements("contact") 

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

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

+0

Добро пожаловать в Stackoverflow - одно из советов: если вы публикуете фрагменты кода или фрагменты XML, ** пожалуйста ** выделите эти строки и нажмите кнопку «код» (101 010) на панели инструментов редактора, чтобы правильно отформатировать их , Делает ваш пост настолько приятным и читаемым! –

ответ

16

Довольно просто: есть 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 по адресу Working with XML Namespaces.

+0

Возможно, это моя единственная жалоба с linq2xml API. Большинство программ, над которыми я работал, не заинтересованы в пространстве имен, но для его обработки необходим код. –

+2

@Frank: но что хорошего в том, чтобы иметь пространства имен (разработанные специально для устранения неоднозначности элементов с тем же именем), когда ваш API явно игнорирует их? Не имеет для меня большого смысла, действительно .... –

+0

ДЕЙСТВИТЕЛЬНО ... Я ПОЗВОЛЯЮ ЭТО ТЕПЕРЬ, В любом случае, спасибо спасибо, это невероятно, вы ответили мне так быстро .... Спасибо за настоящее, я дам тебе знать, как это происходит ... Просто нужно попробовать :) –

0

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

xmldoc.Root.Elements("contact"); 

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

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