2017-07-04 26 views
0

我有一個打印按鈕,它提供XML數據以填充adobe生命週期模板。我試圖將XML中的ROWID與轉發器rowid進行比較,以便打印關於按鈕被點擊的行的信息。LINQ to XML如何將子項與中繼器項目進行比較

Int32 rownum = Convert.ToInt32(e.CommandArgument.ToString()); 
string xmlROWID = Xmld.Descendants("ROWID").First().Value; 

下面是在XML的孩子2:

<VKRSADL> 
    <CUSTOMER_SADLS> 
     <TABLEVALUE> 
     <ROW> 
      <ROWID>0</ROWID> 
      <ID>Съкредитополучател</ID> 
      <TYPE>48</TYPE> 
      <TYPEID>1</TYPEID> 
      <TYPECODE>1</TYPECODE> 
      <CRSCODE>777</CRSCODE> 
      <EGN /> 
      <NAME /> 
      <XML> 
      <SADL0> 
       <OwnerCrsCode /> 
       <TABLEVALUE /> 
      </SADL0> 
      </XML> 
      <XMLCHECK /> 
     </ROW> 
     <ROW> 
      <ROWID>1</ROWID> 
      <ID>Съкредитополучател</ID> 
      <TYPE>48</TYPE> 
      <TYPEID>2</TYPEID> 
      <TYPECODE>1</TYPECODE> 
      <CRSCODE>123123</CRSCODE> 
      <EGN /> 
      <NAME /> 
      <XML> 
      <SADL1> 
       <OwnerCrsCode /> 
       <TABLEVALUE /> 
      </SADL1> 
      </XML> 
      <XMLCHECK /> 
     </ROW> 
     </TABLEVALUE> 
    </CUSTOMER_SADLS> 
    </VKRSADL> 

它相較於第一()給了我只有第一ROWID,並且可以有多個。我如何才能將中繼器rowid與每個我已經保存的ROWID進行比較?

我已經試過這樣:

foreach (var child in Xmld.Root.Element("REQUEST").Element("VKRSADL").Element("CUSTOMER_SADLS").Element("TABLEVALUE").Elements("ROW").Elements()) { 
    //DO SOMETHING 
} 

,但我得到一個錯誤: 型「System.NullReferenceException」的異常出現在App_Web_f2rvuyke.dll但在用戶代碼

其他沒有處理信息:對象引用未設置爲對象的實例。

+0

你可以減少到[mcve]嗎?除非它真正綁定到ASP.NET,否則最好刪除該依賴關係,並最終以控制檯應用程序結束 - 並示例XML。 (不清楚你的問題是獲取中繼器ID還是將它們與XML進行比較......) –

+0

我現在就這樣做,我只是認爲可能會更好地深入一點。更新。 –

+1

那麼這不是一個[mcve] - 你只有兩行代碼和一部分XML文檔。再次,請儘可能清楚你想要做什麼,以及你如何嘗試去做。 (是的,'First()'只會給你一個單一的元素 - 爲什麼要使用它?你沒有使用'First()'就試過了什麼?) –

回答

1

當我從你的問題明白了,你想通過ROW元素進行迭代來獲得所有元素,他們的ROWID等於某個值。

下面我打印ROWID到控制檯窗口中你可以使用下面的代碼來獲取所有ROW元素,那麼你可以做你想做什麼都與每個ROW,在我的例子:

string xml = "<VKRSADL><CUSTOMER_SADLS><TABLEVALUE><ROW><ROWID>0</ROWID><ID>Съкредитополучател</ID><TYPE>48</TYPE><TYPEID>1</TYPEID><TYPECODE>1</TYPECODE><CRSCODE>777</CRSCODE><EGN /><NAME /><XML><SADL0><OwnerCrsCode /><TABLEVALUE /></SADL0></XML><XMLCHECK /></ROW><ROW><ROWID>1</ROWID><ID>Съкредитополучател</ID><TYPE>48</TYPE><TYPEID>2</TYPEID><TYPECODE>1</TYPECODE><CRSCODE>123123</CRSCODE><EGN /><NAME /><XML><SADL1><OwnerCrsCode /><TABLEVALUE /></SADL1></XML><XMLCHECK /></ROW></TABLEVALUE></CUSTOMER_SADLS></VKRSADL>"; 
XDocument xDoc = XDocument.Parse(xml); 

foreach (var child in xDoc.Element("VKRSADL").Element("CUSTOMER_SADLS").Element("TABLEVALUE").Elements().Where(e => e.Name == "ROW")) 
{ 
    Console.WriteLine(child.Element("ROWID").Value); 
} 

注:以上例子假設XML模式不會被更改,如果它改變,那麼可能會發生異常。

+0

我發現這是獲得我期待的結果的最佳方式,謝謝。 –

1

嘗試以下操作:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      var results = doc.Descendants("ROW").Select(x => new { 
       rowID = (int)x.Element("ROWID"), 
       id = (string)x.Element("ID"), 
       type = (int)x.Element("TYPE"), 
       typeID = (int)x.Element("TYPEID"), 
       typeCode = (int)x.Element("TYPECODE"), 
       crsCode = (int)x.Element("CRSCODE"), 
      }).ToList(); 
     } 
    } 
} 
相關問題