2017-07-18 14 views
0

こんにちは私はforeachを動作させるのに問題があります。私のsimpel linqクエリでは、1つのノードしか選択しません。私は、Xmldocumentとxmlnodelistを使用するために私が使用したので、問題は何もありません。しかし、私は本当にLinqを使用してそれを学ぶために、私は何かを見つけることができないGoogleの理由は、私はすべてこれらのリンクexpmales tryede tryede。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/

これらの両方の実施例は、単に、1つの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

私はあなたのコードをテストしてみたが、私は何の問題を見ることができない。それは3つのノードを返します。 : 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たびにループあなたの項目を介して出力を設定します。その結果、あなたのリストの最後の項目をnlyで処理します。私が代わりに+の文字列を構築するためにStringBuilderを使用することをお勧めしますあなたはこの

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

thx私はsbについて知っています、私はそれがずっと速かったのか分かりませんでした。ありがとう:) –

+0

あなたの歓迎:-) –