IEnumerable <XElement>и foreach - PullRequest
       0

IEnumerable <XElement>и foreach

4 голосов
/ 26 мая 2011

Я хотел бы выбрать все элементы

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.

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

1 Ответ

12 голосов
/ 26 мая 2011

Ваше предложение 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-файла вместе с ожидаемым результатом.

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

РЕДАКТИРОВАТЬ: Если вы хотите использовать IEnumerable<IEnumerable<XElement>> вы можете использовать:

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