2017-10-04 55 views
0

我想從XML文件中檢索數據並在列表中返回分析的數據。根據我用什麼來訪問數據(元素或屬性),我得到null(在Element的情況下)或我無法解密的東西(在屬性的情況下)。需要幫助使用Linq檢索XML數據

XML是這樣的:

<DATA_RESPONSE> 
    <HEADER> 
     <MSGID>IS20101P:091317125610:98::34:0</MSGID> 
    </HEADER> 
    <DATA> 
     <ROW ID='IS20101P' PE_NAME='APP-029' PE_ID='4' CODE='4829' DATA='5,1,500,1' /> 
     <ROW ID='IS20101P' PE_NAME='APPS-029' PE_ID='4' CODE='4829' DATA='4,1,500,1' /> 
     ... 
    </DATA> 
    <SUMMARY> 
    </SUMMARY> 
    <ERRORS> 
    </ERRORS> 
</DATA_RESPONSE> 

我使用以下來獲取數據。我讀了一個字符串的文件和存儲XML和調用一個方法與此字符串作爲參數:

public static Hashtable GetIDSData(string sXMLString) 
{ 
    Hashtable result = new Hashtable(); 

    result.Add("Success", false); 
    result.Add("ErrorMessage", ""); 
    result.Add("ID", ""); 
    result.Add("PE_NAME", ""); 
    result.Add("PE_ID", ""); 
    result.Add("CODE", ""); 
    result.Add("DATA", ""); 

    xmlDoc.InnerXml = sXMLString; 
    XmlElement root = xmlDoc.DocumentElement; 
    XDocument doc = XDocument.Parse(sXMLString); 
    XmlNode node = xmlDoc.SelectSingleNode("DATA_RESPONSE/DATA"); 

    if (node != null) 
    { 
     var AddressInfoList = doc.Root.Descendants("ROW").Select(Address => new 
     { 
      ID = Address.Attributes("ID")?.ToString(), 
      PEName = Address.Attributes("PE_NAME")?.ToString(), 
      PEID = Address.Attributes("PE_ID")?.ToString(), 
      Code = Address.Attributes("CODE")?.ToString(), 
      Data = Address.Attributes("DATA")?.ToString(), 
     }).ToList(); 

     foreach (var AddressInfo in AddressInfoList) 
     { 
      if (string.IsNullOrEmpty(AddressInfo.Code)) 
      { 
       result["Success"] = false; 
       result["ErrorMessage"] = "Invalid Code; code is empty."; 
      } 
      else 
      { 
       result["Success"] = true; 
       result["ErrorMessage"] = ""; 
       result["ID"] = AddressInfo.ID; 
       result["PE_NAME"] = AddressInfo.PEName; 
       result["PE_ID"] = AddressInfo.PEID; 
       result["CODE"] = AddressInfo.Code; 
       result["DATA"] = AddressInfo.Data; 
      } 
     } 
     return result; 
    } 

在LINQ部分,如果我使用Address.Element(「ID」)值,我得到空返回。 在XML中沒有使用名稱空間。

回答

2

首先,該GetIDSData()方法不按原樣編譯,因爲在該行xmlDoc.InnerXml = sXMLStringxmlDoc還沒有已被定義。

我假設你想xmlDoc是裝有sXMLString參數的內容的XmlDocument,所以我改變了該行:

XmlDocument xmlDoc = new XmlDocument {InnerXml = sXMLString}; 

此外,您root變量從未使用過,所以爲了清晰起見,我刪除了它

現在爲你的問題的主要部分,鑑於你目前的語法,你在屬性的集合,這顯然不是你想要什麼叫.ToString()。爲了解決這個問題,當你迭代AddressInfoList,你要取像的屬性值:

ID = Address.Attributes("ID")?.Single().Value 

ID = address.Attribute("ID")?.Value 

...而不是Address.Attributes("ID")?.ToString()你有以上。

+0

保羅和尤里的建議都奏效。保羅的變化最小,在尤里的解決方案中,它抱怨c是一個字符!string.IsNullOrEmpty(c)。我希望我可以將這兩個標誌都視爲解決方案,也許是特種部隊可能想到的。 – NoBullMan

0
ID = Address.Attributes("ID")?.ToString(), 

你想用Attribute(name)(不s),而不是:

ID = Address.Attributes("ID")?.Value, 
1

您未選擇屬性的值。在你的代碼中你正在選擇屬性。不知道什麼是你想實現的,但在這裏的是,加載所有元素融入到數據表

public static DataTable GetIDSData(string sXMLString) 
{ 
    DataTable result = new DataTable(); 

result.Columns.Add("Success"); 
result.Columns.Add("ErrorMessage"); 
result.Columns.Add("ID"); 
result.Columns.Add("PE_NAME"); 
result.Columns.Add("PE_ID"); 
result.Columns.Add("CODE"); 
result.Columns.Add("DATA"); 

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.InnerXml = sXMLString; 
XmlElement root = xmlDoc.DocumentElement; 
XDocument doc = XDocument.Parse(sXMLString); 
XmlNode node = xmlDoc.SelectSingleNode("DATA_RESPONSE/DATA"); 

if (node != null) 
{ 
    var AddressInfoList = doc.Root.Descendants("ROW").Select(Address => new 
    { 
     ID = Address.Attributes("ID").Select(i=>i.Value) , 
     PEName = Address.Attributes("PE_NAME").Select(i=>i.Value), 
     PEID = Address.Attributes("PE_ID").Select(i=>i.Value), 
     Code = Address.Attributes("CODE").Select(i=>i.Value), 
     Data = Address.Attributes("DATA").Select(i=>i.Value), 
    }).ToList(); 



    AddressInfoList.ForEach(e => 
    { 
     e.Code.ToList().ForEach(c => 
     { 
      DataRow row = result.NewRow(); 
      if (!string.IsNullOrEmpty(c)) 
      { 

       row["Success"] = true; 
       row["ErrorMessage"] = ""; 
       row["ID"] = e.ID.First(); 
       row["PE_NAME"] = e.PEName.First(); 
       row["PE_ID"] = e.PEID.First(); 
       row["CODE"] = e.Code.First(); 
       row["DATA"] = e.Data.First(); 

      } 
      else 
      { 
       row["Success"] = false; 
       row["ErrorMessage"] = "Invalid Code; code is empty."; 
      } 
      result.Rows.Add(row); 

    });}); 
    result.Dump(); 
    return result; 
} 
return result; 

}

你的代碼我的修改版,這是結果,你會在你的數據表中得到。 enter image description here