Linq to xml foreach不工作

时间:2017-07-18 09:37:47

标签: c# asp.net xml linq

您好我的foreach工作有问题。它只在我的simpel linq查询中选择一个节点。我没有问题是什么,因为我usede使用Xmldocument和xmlnodelist。但我真的想学习使用Linq,我在谷歌上找不到任何东西,为什么它不工作,我还试着在这些链接上的expmales。

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

Simple LINQ to XML is not working

https://forums.asp.net/t/1378244.aspx?Linq+to+XML+query+how+to+get+all+elements+but+excluding+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>

2 个答案:

答案 0 :(得分:1)

在这两个示例中,每次循环浏览项目时都会设置输出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来构建字符串而不是+; whcih看起来像这个例子。

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

答案 1 :(得分:0)

我已经测试了你的代码,但我看不出任何问题:它返回三个节点: xml example

如果你想选择3个Xelement节点“lakeringsdel”中的所有元素,你可以这样做:

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

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

给出: xml example 2

或直接:

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


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

给出相同的结果

或一行:

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);
        }

或一行:

 test.AddRange(q);