IEnumerable <XElement>和foreach

Bra*_*ski 4 c# linq ienumerable

我想选择一个的所有元素

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);
 }
Run Code Online (Sandbox Code Playgroud)

如何输出所有元素?我在迭代器方面遇到了一些问题.

我现在不知道如何使用foreach迭代IEnumerable并访问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>
Run Code Online (Sandbox Code Playgroud)

我必须将此XML文件导入规范化的MySQL表.ARTCOMP/ARTBAR是MySQL Datebase中的附加表.

首先,我想在一个空的MySQL表中创建所有字段作为varchar().作为另一个问题,并非每个ART元素都具有相同的子元素.也许有更好的方法来找到所有可能的子元素(一种模式).

Jon*_*eet 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;
Run Code Online (Sandbox Code Playgroud)

要么:

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

甚至:

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

这将q只是一种类型IEnumerable<XElement>- 它基本上会使结果变平.您将得到一个直接在名为"ART"的元素下面的所有元素的序列,该元素又具有值为15的"ID"元素.

如果这不是您想要的,请提供更多信息 - 理想情况下是一个示例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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 注意使用强制转换`(int)artikel.Element("ID")== 15` - 这是XLinq API上非常好的一点:它试图将`Value`属性转换为类型而不需要访问`Value`属性并处理异常(如果不存在).此外,您可以强制转换为`int?`,如果该元素不存在,将返回`null`,允许您容忍丢失的节点而无需繁琐的检查. (2认同)