2017-07-18 98 views
0

嗨,我有问题让我的foreach工作。它只选择一个节点,在我的simpel linq查询中。我实际上不知道问题是什么,因为我使用Xmldocument和xmlnodelist。但我真的想学习如何使用Linq,我找不到任何关于谷歌为什么它不工作,我也尝试在这些链接上的expmales。Linq to xml foreach无法正常工作

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> 
+1

您在示例代码中的字符串将保存最后的迭代结果。也许你想追加它或什么。 – Reniuz

+0

此外,您还需要转义用于构建字符串的值,如果ledenr,lakeringsDel,lakeringsMetode或arbejdsEnheder包含&或 Sprotty

+0

另请参阅https://stackoverflow.com/questions/341872/html-sanitizer-for-net – Sprotty

回答

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

这给相同的结果

或在1行内:

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

但作为评论说Reniuz:

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); 
+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打造的字符串,而不是+;这可能看起来像这个例子。

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

thx我知道某人,我不知道它快得多。谢谢:) –

+0

欢迎您:-) –