簡體   English   中英

Linq到XML foreach不起作用

[英]Linq to xml foreach not working

嗨,我在讓我的foreach工作時遇到問題。 在我的simpel linq查詢中,它僅選擇一個節點。 我實際上沒有什么問題,因為我曾經使用過Xmldocument和xmlnodelist。 但是我真的很想學習使用Linq做到這一點,我在Google上找不到為什么它不起作用的任何東西,因此我嘗試了這些鏈接上的expmale。

http://www.dotnetcurry.com/linq/564/linq-to-xml-tutorials-examples

簡單的LINQ to XML無法正常工作

https://forums.asp.net/t/1378244.aspx?Linq+to+XML+query+how+to+get+all+elements+but+except+some+

http://www.c-sharpcorner.com/UploadFile/de41d6/learning-linq-made-easy-linq-to-xml-tutorial-3/

這兩個示例僅返回一個xml節點。

XElement ele = XElement.Load(filePath);
String aXmlString = ele.ToString(SaveOptions.DisableFormatting) + ele.Value;

foreach (XElement xNode in ele.Descendants("lakeringsdel"))
{
    //litTest.Text = xNode.Element("lakeringsMetode").Value;

    strData = "<table style='width:100%;' >"
         + "<tr>"
         + "<th>Nr.</th>"
         + "<th>Arbejdsbeskrivelse/Omfang</th>"
         + "<th>Metode</th>"
         + "<th>Ae</th>"
         + "</tr>"
         + "<tr>"
         + "<td>" + xNode.Element("ledenr").Value + "</td>"
         + "<td>" + xNode.Element("lakeringsDel").Value + "</td> "
         + "<td>" + xNode.Element("lakeringsMetode").Value + "</td> "
         + "<td>" + xNode.Element("arbejdsEnheder").Value + "</td> "
         + "</tr>"
         +
         "</table>";
}

下一個例子

var test = "";
var q = from c in ele.Descendants("lakeringsdel")
        select c.Element("lakeringsDel").Value;

foreach (string item in q)
{
    test = item;
}

我的xml文件

<lakRapportDetaljer>
     <aePrTime>10</aePrTime>
     <fabrikatModelTekst>FORD FOCUS (CEW)</fabrikatModelTekst>
     <kilometerStand>28205</kilometerStand>
     <lakArbejde>2745.0</lakArbejde>
     <lakIaltTotal>3610.05</lakIaltTotal>
     <lakIndex>134</lakIndex>
     <lakMaterialer>865.05</lakMaterialer>
     <lakTimepris>450.0</lakTimepris>
     <lakeringsMetode>2-LAGS METALLIC</lakeringsMetode>
     <lakeringsMetode>DØRGREB LEVERES LAKE</lakeringsMetode>
     <lakeringsdel>
        <arbejdsEnheder>10.0</arbejdsEnheder>
        <lakeringsDel>KOFANGER H B</lakeringsDel>
        <lakeringsMetode>REPARATION LAK.PLAST</lakeringsMetode>
        <ledenr>2584</ledenr>
     </lakeringsdel>
     <lakeringsdel>
        <arbejdsEnheder>15.0</arbejdsEnheder>
        <lakeringsDel>BAGSKÆRM HØJRE</lakeringsDel>
        <lakeringsMetode>REP.LAK. &amp;lt;50%, METAL</lakeringsMetode>
        <ledenr>3482</ledenr>
     </lakeringsdel>
     <lakeringsdel>
        <arbejdsEnheder>5.0</arbejdsEnheder>
        <lakeringsDel>SPECIALAFDÆKNING</lakeringsDel>
        <lakeringsMetode>OVERFLADE LAKERING</lakeringsMetode>
        <ledenr>1000</ledenr>
     </lakeringsdel>
     <miljoeLakMaterialerProcent>6</miljoeLakMaterialerProcent>
</lakRapportDetaljer>

在這兩個例子中,你設置輸出strDatatest ,通過您的項目你每次循環。 這樣就只能處理列表中的最后一項。

假設您要在首頁上顯示一個包含結果的表格,則應將第一個示例更改為此

XElement ele = XElement.Load(filePath);
String aXmlString = ele.ToString(SaveOptions.DisableFormatting) + ele.Value;

strData = "<table style='width:100%;' >"
         + "<tr>"
         + "<th>Nr.</th>"
         + "<th>Arbejdsbeskrivelse/Omfang</th>"
         + "<th>Metode</th>"
         + "<th>Ae</th>"
         + "</tr>"

foreach (XElement xNode in ele.Descendants("lakeringsdel"))
{
    //litTest.Text = xNode.Element("lakeringsMetode").Value;

    strData += "<tr>"
         + "<td>" + xNode.Element("ledenr").Value + "</td>"
         + "<td>" + xNode.Element("lakeringsDel").Value + "</td> "
         + "<td>" + xNode.Element("lakeringsMetode").Value + "</td> "
         + "<td>" + xNode.Element("arbejdsEnheder").Value + "</td> "
         + "</tr>";         
}

strData += "</table>";

我建議使用StringBuilder而不是+來構建字符串。 看起來像這個例子。

StringBuilder strData = new StringBuilder("<table style='width:100%;'>");
strData.AppendLine("<tr>");
strData.AppendLine("<th>Nr.</th>");

我已經測試了您的代碼,但看不到任何問題:它返回三個節點: xml范例

如果要選擇3個Xelement節點“ lakeringsdel”內的所有元素,則可以執行以下操作:

  var q = from c in ele.Descendants("lakeringsdel")
                select c;

        foreach (XElement item in q)
        {
            test = item.Value;
        }

這使 : xml范例2

或直接:

  var q = ele.Descendants("lakeringsdel");


        foreach (XElement item in q)
        {
            test = item.Value;
        }

得到相同的結果

或1行:

ele.Descendants("lakeringsdel").ToList().ForEach(elem=>test =elem.Value);

但是正如Reniuz在評論中所說:您只將最后一個結果存儲在“ test”變量中

如果要存儲所有結果,可以執行以下操作:

List<string> test = new List<string>();
var q = from c in ele.Descendants("lakeringsdel")
                select c.Element("lakeringsDel").Value;

        foreach (string item in q)
        {
            test.Add(item);
        }

或1行:

 test.AddRange(q);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM