2011-05-26 71 views
4

我想選擇的IEnumerable的<XElement>和foreach

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屬性。

// * ** aditional的信息 //

示例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數據庫中的附加表。

作爲一個開始,我想在一個空的MySQL表中創建所有的字段作爲varchar()。作爲另一個問題,並非每個ART元素都具有相同的子元素。也許有更好的方式來找到所有可能的子元素(模式類型)。

+0

沒有什麼不對您的'foreach',越有可能是您的查詢不返回任何元素。嘗試在調試器中檢查'q'。它包含什麼? – driis 2011-05-26 16:21:59

+2

@driis:沒有,給定的代碼不會編譯。 'Name'不是'IEnumerable '的屬性... ... – 2011-05-26 16:22:48

回答

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; 

這將會給一個類型的只是IEnumerable<XElement>q - 將壓扁的結果,基本上是這樣。您將得到一系列所有元素,這些元素直接位於名爲「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); 
    } 
} 
+2

請注意鑄造'(int)artikel的使用。元素(「ID」)== 15' - 這是XLinq API非常好的一個接觸:它試圖將Value屬性轉換爲類型,而不需要訪問Value屬性並處理異常如果它不存在。此外,你可以強制轉換爲'int?',如果該元素不存在,'null'將被返回,允許你容忍丟失的節點而無需繁瑣的檢查。 – codekaizen 2011-05-26 16:35:51

+0

非常感謝您的回覆。 正如您在帖子中所述,q的類型是IEnumerable >。 如果我在調試器中檢查變量q,我會看到很多結果。 我的問題是,我不知道如何迭代每個結果。我的目標是找出所有元素的所有名稱。對於每個元素名稱,我必須在MySQL表中創建一個字段。 我的問題是,我不知道如何處理IEnumerable >並迭代它們。 – Brainski 2011-05-27 12:06:18

+0

@Brainski:好的,如果你想*它是一個IEnumerable >',這很容易處理。我會編輯... – 2011-05-27 12:18:49

相關問題