2011-05-26 1 views
4

Я хотел бы, чтобы выбрать все элементыIEnumerable <XElement> и Еогеасп

var q = from artikel in xmlSource.Descendants("ART") 
    where artikel.Element("ID").Value.Equals("15") 
    select artikel.Elements(); 

//Does not work 
foreach (var element in q) 
{ 
    Console.WriteLine("Customer name = {0}", element.Name); 
} 

Как я могу выводить все элементы? У меня есть некоторые проблемы с итераторами.

Я не сейчас, как итерации IEnumerable с foreach и доступ к свойству element.Name.

// * ** ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ //

Пример XML

<ARTICLE> 
    <ART> 
    <ID>0020209</ID> 
    <EXP>36</EXP> 
    <QTY>1</QTY> 
    <SMCAT>B</SMCAT> 
    <DSCRD>Example Description 1</DSCRD> 
    <ARTCOMP> 
     <COMPNO>10710</COMPNO> 
     <ROLE>H</ROLE> 
     <ARTNO1>320059</ARTNO1> 
     <ARTNO2>320059</ARTNO2> 
    </ARTCOMP> 
    <ARTCOMP> 
     <COMPNO>10710</COMPNO> 
     <ROLE>V</ROLE> 
     <ARTNO1>320059</ARTNO1> 
     <ARTNO2>320059</ARTNO2> 
    </ARTCOMP> 
    <ARTBAR> 
     <CDTYP>E13</CDTYP> 
     <BC>7680202580475</BC> 
     <BCSTAT>A</BCSTAT> 
    </ARTBAR> 
    <ARTPRI> 
     <VDAT>2010-12-01T00:00:00+01:00</VDAT> 
     <PTYP>PEXF</PTYP> 
     <PRICE>30</PRICE> 
    </ARTPRI> 
    </ART> 
    <ART> 
    <ID>0020244</ID> 
    <EXP>60</EXP> 
    <QTY>30</QTY> 
    <DSCRD>FERRO GRADUMET Depottabl 30 Stk</DSCRD> 
    <ARTCOMP> 
     <COMPNO>1836</COMPNO> 
     <ROLE>H</ROLE> 
     <ARTNO1>685230</ARTNO1> 
     <ARTNO2>685230</ARTNO2> 
    </ARTCOMP> 
    <ARTCOMP> 
     <COMPNO>1836</COMPNO> 
     <ROLE>V</ROLE> 
     <ARTNO1>685230</ARTNO1> 
     <ARTNO2>685230</ARTNO2> 
    </ARTCOMP> 
    <ARTCOMP> 
     <COMPNO>5360</COMPNO> 
     <ROLE>L</ROLE> 
     <ARTNO1>685230</ARTNO1> 
     <ARTNO2>685230</ARTNO2> 
    </ARTCOMP> 
    </ART> 
</ARTICLE> 

Я должен импортировать XML-файл в нормализованной таблицы MySQL. ARTCOMP/ARTBAR являются дополнительными таблицами в базе данных MySQL Datebase.

В качестве начала я хотел создать все поля как varchar() в пустой таблице MySQL. В качестве дополнительной проблемы не каждый элемент ART имеет одинаковые дочерние элементы. Возможно, есть лучший способ найти все возможные дочерние элементы (вид схемы).

+0

Там нет ничего плохого с 'foreach', более вероятно, ваш запрос не возвращает никаких элементов. Попробуйте изучить 'q' в отладчике. Что он содержит? – driis

+2

@driis: Нет, данный код не будет компилироваться. 'Name' не является свойством' IEnumerable '... –

ответ

12

Ваше предложение select означает, что тип q на самом деле IEnumerable<IEnumerable<XElement>>. Я подозреваю, что вы имели в виду:

var q = from artikel in xmlSource.Descendants("ART") 
     where artikel.Element("ID").Value.Equals("15") 
     from element in artikel.Elements() 
     select element; 

Или:

var q = from artikel in xmlSource.Descendants("ART") 
     where (string) artikel.Element("ID") == "15" 
     from element in artikel.Elements() 
     select element; 

или даже:

var q = from artikel in xmlSource.Descendants("ART") 
     where (int) artikel.Element("ID") == 15 
     from element in artikel.Elements() 
     select element; 

Это даст тип для q чуть IEnumerable<XElement> - это будет сглаживать результаты, в основном. Вы получите последовательность всех элементов, которые находятся непосредственно под элементом «ART», который, в свою очередь, имеет элемент «ID» со значением 15.

Если это не то, что вы ищете , пожалуйста, дайте больше информации - в идеале образец XML-файла вместе с вашим ожидаемым результатом.

Это кажется маловероятным, что вы действительно хотите напечатать имя элемента всех элементов, хотя ... имя клиента должно быть сохранен как значения где-то (либо текст внутри элемента или атрибут), не как имя элемента.

EDIT: Если вы хотите , чтобы использовать IEnumerable<IEnumerable<XElement>> вы можете использовать:

foreach (var result in q) 
{ 
    Console.WriteLine("Next result..."); 
    foreach (var element in result) 
    { 
     Console.WriteLine("Got name: {0}", element.Name); 
    } 
} 
+2

Обратите внимание на использование метаданных' (int).Элемент («ID») == 15' - это один из очень приятных штрихов в API XLinq: он пытается применить свойство «Value» к типу без необходимости доступа к свойству «Значение» и справиться с исключением если его нет. Кроме того, вы можете использовать 'int? ', И если элемент не существует, возвращается« null », что позволяет переносить отсутствующие узлы без обременительной проверки. – codekaizen

+0

Большое спасибо за ваш ответ. Как вы заявили в сообщении, тип q является IEnumerable >. Если я проведу переменную q в отладчике, я вижу много результатов. Моя проблема в том, что я не знаю, как проходить через результат с каждым. Моя цель - узнать все имена всех элементов. Для каждого имени элемента мне нужно создать поле в таблице MySQL. Моя проблема в том, что я не знаю, как обрабатывать IEnumerable > и повторять их. – Brainski

+0

@Brainski: Хорошо, если вы хотите, чтобы это было 'IEnumerable >', с этим достаточно справиться. Я отредактирую ... –

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

  • Нет связанных вопросов^_^