2017-10-04 19 views
0

XMLファイルからデータを取得し、解析されたデータをリストに戻そうとしています。私がデータ(要素または属性)にアクセスするために使用するものに応じて、私はnull(Elementの場合)または解読できないもの(Attributesの場合)を取得します。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を読み込み、引数としてこの文字列でメソッドを呼び出します。LINQのセクションで

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

、私はAddress.Element(「ID」)を使用した場合の値、Iはnullを返します。 XMLには名前空間は使用されていません。

答えて

2

まずオフラインxmlDoc.InnerXml = sXMLStringで、xmlDocはしていないので、GetIDSData()方法は、そのままコンパイルされません。定義されている。そう、あなたのroot変数が使用されることはありません、また

XmlDocument xmlDoc = new XmlDocument {InnerXml = sXMLString}; 

私はあなたがsXMLStringパラメータの内容がロードXmlDocumentするxmlDocをしたいと仮定していますので、私はその行への変更していますわかりやすくするために削除しました。

は今、あなたの現在の構文を与え、あなたの質問の主要部分に関しては、あなたが望むものは明らかではない属性の コレクション、上 .ToString()を呼び出しています。あなたは上記の持っているよう

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

または

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

...ではなくAddress.Attributes("ID")?.ToString():あなたはAddressInfoListを反復しているときに、この問題を解決するには、次のような属性値を取得したいです。

+0

PaulとYuriの両方の提案が機能しました。ポールは変化が最も少なく、ユリの解決策では、!string.IsNullOrEmpty(c)の文字であることに不満を抱いていました。私は両方を解決策にしたいと思っています.SOFが考えるかもしれない何か。 – NoBullMan

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

あなたが代わりに(sなし)Attribute(name)を使用したい:

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

属性の値は選択されていません。あなたのコードでは、属性を選択しています。わからない何を達成しようとしますが、ここでのDataTable

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; 

}

にすべての要素をロードし、これは、あなたのDataTableのでしょう結果であるあなたのコードの私の修正版があるされています。 enter image description here

関連する問題