2011-07-27 21 views
4

リモートXMLファイルを読み込んでいて、XMLをXMLDocumentオブジェクトにロードしたら、それを調べて、アプリケーションに必要な値を抽出する必要があります。C#でリモートXMLを読む

XmlDocument xmlDocument = new XmlDocument(); 
    xmlDocument.Load("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"); 

    XmlNamespaceManager nsMan = new XmlNamespaceManager(xmlDocument.NameTable); 
    nsMan.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01"); 
    nsMan.AddNamespace("", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"); 


    XmlNodeList xmlNodeList = xmlDocument.DocumentElement.SelectNodes("/gesmes:Envelope/Cube/Cube/Cube", nsMan); 

    HttpContext.Current.Response.Write("The numner of nodes is " + xmlNodeList.Count); //it's always zero 

私は取得しています問題は、私はXMLSpyの中でXPath式を評価する場合、私は私が必要とするノードを取得するのに対しいるXmlNodeListは常に、ゼロのノードを返すということですが、次のように私のコードです。

<?xml version="1.0" encoding="UTF-8"?> 
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01" xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref"> 
<gesmes:subject>Reference rates</gesmes:subject> 
<gesmes:Sender> 
    <gesmes:name>European Central Bank</gesmes:name> 
</gesmes:Sender> 
<Cube> 
    <Cube time='2011-07-27'> 
     <Cube currency='USD' rate='1.4446'/> 
     <Cube currency='GBP' rate='0.88310'/> 
    </Cube> 
</Cube> 
</gesmes:Envelope> 

私はUSDとGBPのためのキューブノードを返したい:

参考のためにXMLは次のようになります。

あなたは賢い人ですか?

おかげ アル

答えて

12

あなたは間違いなくXmlDocument APIにおける名前空間とXPathと仕事は、私が強くアドバイスあなたは、XML(.NET 3.5)で、すべての可能な場合にLINQを使用するようになりますが:

string url = "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"; 
XDocument doc = XDocument.Load(url); 

XNamespace gesmes = "http://www.gesmes.org/xml/2002-08-01"; 
XNamespace ns = "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"; 

var cubes = doc.Descendants(ns + "Cube") 
       .Where(x => x.Attribute("currency") != null) 
       .Select(x => new { Currency = (string) x.Attribute("currency"), 
            Rate = (decimal) x.Attribute("rate") }); 

foreach (var result in cubes) 
{ 
    Console.WriteLine("{0}: {1}", result.Currency, result.Rate); 
} 
+0

巧みな賢さ - どのように結果をループさせるのですか? Linqとはあまり良くない!? – higgsy

+0

@higgsy:編集結果を表示します。 –

+0

スポットで、素晴らしい解決策 - ありがとう! – higgsy