2011-01-20 9 views
24

XML noobはこちら! は、だから私はいくつかのXMLデータを持っている:.NETでのXMLの読み方

<DataChunk> 
    <ResponseChunk> 
     <errors> 
      <error code=\"0\"> 
       Something happened here: Line 1, position 1. 
      </error> 
     </errors> 
    </ResponseChunk> 
</DataChunk> 

どのように私は、私は、「エラーコード」とテキスト記述以下へのアクセスを得ることができ、「エラー」のリストになるだろうか...? また、私はC#で.net4.0を使っています... ...ありがとう!

+1

私はこれを仮定している: '<エラーコード= \ "0 \"> 「あなたのXMLが実際にどのように見えるかではないでしょうか?それらのスラッシュはそれを壊してくれるでしょう、あなたはカットアンドペーストしたC#をエスケープしていますか? –

+0

@james Yeah>。<私はXMLを文字列にロードしてhehをコピーしました – sringer

答えて

44

XMLをXmlDocumentにロードしてから、xpathクエリを使用して必要なデータを抽出します。

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlstring); 

XmlNode errorNode = doc.DocumentElement.SelectSingleNode("/DataChunk/ResponseChunk/Errors/error"); 

string errorCode = errorNode.Attributes["code"].Value; 
string errorMessage = errorNode.InnerText; 

あなたはそのxpathですべての要素が含まれているXmlNodeListを取得するためにSelectNodesを使用することができ、複数のエラー要素を持つXMLの可能性がある場合の例については

。たとえば、次のように

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlstring); 

XmlNodeList errorNodes = doc.DocumentElement.SelectNodes("/DataChunk/ResponseChunk/Errors/error"); 

foreach(XmlNode errorNode in errorNodes) 
{ 
    string errorCode = errorNode.Attributes["code"].Value; 
    string errorMessage = errorNode.InnerText; 
} 

オプション2

あなたはXMLのためのXMLスキーマを持っている場合は(.NETのXsd.exeではツールを使用して)クラスにスキーマを結合することができます。いったんそれを持っていれば、XMLをオブジェクトに逆シリアル化して、生のXMLではなくそのオブジェクトからXMLを処理できます。これは全体的な主題ですので、スキーマを持っていれば調べる価値があります。

+0

あなたは 'SelectSingleNode'を持っていますが、OPは' error'ノードのリストが必要です。 – Gabe

+0

@Gabe:しかし、私も "複数のエラー要素を持つXMLの可能性がある場合、SelectNodesを使用してそのxpathのすべての要素を含むXmlNodeListを取得できます。" - しかし、複数のエラーノードのサンプルコードが追加されました。 – MrEyes

+0

@joey:ソファから半分のテレビを見て半分の投稿を得ることがthats :) – MrEyes

23

あなたはLinq to XMLを使用することができます。

var doc = XDocument.Parse(xml); 
var errors = from e in doc.Descendants("error") 
      select new 
      { 
       code = e.Attribute("code").Value, 
       msg = e.Value.Trim() 
      }; 

foreach (var e in errors) 
{ 
    // use e.code & e.msg 
} 

入力XMLが非常に大きいある場合しかし、XMLReaderで文書を通過した方が良いかもしれません。

3
XmlReader xmlReader = XmlReader.Create(new StringReader(response)); 
     AmortizationCalculatorBE amortization = new AmortizationCalculatorBE(); 
List<PaymentCalculator> paymentList = new List<PaymentCalculator>(); 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(new StringReader(response)); 
     XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("response/amortizationschedule/payment"); 
     XmlNodeList nodeList2 = xmlDoc.DocumentElement.SelectNodes("response"); 
     foreach (XmlNode node in nodeList) 
     { 
      PaymentCalculator payment = new PaymentCalculator(); 
      payment.beginningbalance = node.SelectSingleNode("beginningbalance").InnerText; 
      payment.principal = node.SelectSingleNode("principal").InnerText; 
      payment.interest = node.SelectSingleNode("interest").InnerText; 
      paymentList.Add(payment); 

     } 
     amortization._PaymentCalculator = paymentList; 
     foreach (XmlNode node in nodeList2) 
     { 
      amortization.totalprincipal = node.SelectSingleNode("totalprincipal").InnerText; 
      amortization.totalinterest = node.SelectSingleNode("totalinterest").InnerText; 

     } 
関連する問題