2016-08-24 65 views
0

我使用xignite API获取实时货币交换数据。当我使用我的查询字符串:在C#中使用XDoc获取XML元素的内容

http://globalcurrencies.xignite.com/xGlobalCurrencies.xml/GetRealTimeRate?Symbol=GBPEUR&_token=[mytoken] 

我得到如下:

<Rate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns="http://www.xignite.com/services/"> 
    <Outcome>Success</Outcome> 
    <Identity>Request</Identity> 
    <Delay>0.0218855</Delay> 
    <BaseCurrency>USD</BaseCurrency> 
    <QuoteCurrency>EUR</QuoteCurrency> 
    <Symbol>USDEUR</Symbol> 
    <Date>08/24/2016</Date> 
    <Time>3:23:34 PM</Time> 
    <QuoteType>Calculated</QuoteType> 
    <Bid>0.889126</Bid> 
    <Mid>0.88915</Mid> 
    <Ask>0.889173</Ask> 
    <Spread>4.74352E-05</Spread> 
    <Text> 
     1 United States dollar = 0.88915 European Union euro 
    </Text> 
    <Source>Rate calculated from EUR:USD</Source> 
</Rate> 

我试图访问Mid元素的内容,到目前为止,我这样做

var xDoc = XDocument.Load(
    "http://globalcurrencies.xignite.com/xGlobalCurrencies.xml/GetRealTimeRate?Symbol=" 
    + "GBP" + "EUR" + "&_token=[MyToken]"); 
string s = (string)xDoc.Root.Element("Mid"); 
output.Text = s; 

xDoc变量返回与我以前显示的XML,但当我尝试获取Mid元素的内容时,string snull。如何使用XDoc访问元素Mid的内容?

回答

0

我使用Linq to XML,这里是一个例子

XNamespace ns = "http://www.xignite.com/services/"; 
XDocument xdoc = XDocument.Load(xmlPath); 
var rateMids = (from obj in xdoc.Descendants(ns + "Rate") 
       select new Rate 
       (
         obj.Attribute("Outcome").Value, 
         obj.Attribute("Identity").Value, 
         (decimal)obj.Attribute("Delay").Value, 
         obj.Attribute("BaseCurrency").Value, 
         obj.Attribute("QuoteCurrency").Value, 
         obj.Attribute("Symbol").Value, 
         DateTime.Parse(obj.Attribute("Date").Value), 
         obj.Attribute("Time").Value.ToString("hh:mm:ss tt", CultureInfo.CurrentCulture), 
         obj.Attribute("QuoteType").Value, 
         (decimal)obj.Attribute("Bid").Value, 
         (decimal)obj.Attribute("Mid").Value, 
         (decimal)obj.Attribute("Ask").Value, 
         Convert.ToInt32(obj.Attribute("Spread").Value), 
         Convert.ToInt32(obj.Attribute("Text").Value) 
       ) 
       ).ToArray(); 

myObjects将包含MyObjects的XML文件中的阵列。

编辑:既然你用XML更新你的问题,我想你是唯一缺少对查询的命名空间(我的查询NS),请采取查尔斯马杰回答看看

我的答案是不同的方法..您保存Rate对象并使用它,而无需再次读取XML(您需要在类中定义费率) 请注意我所做的值转换,您需要匹配您的类: )

+0

我想这一点,但我有与 NS,REG和MyObject来 他们有什么麻烦吗? – user3711612

+0

问题中的代码也使用LINQ to XML,但不起作用。我不确定通用示例将如何帮助发现当前代码中的错误。 –

+0

@ user3711612我之前的代码存在错误,我修正了它... MyObject在我的示例中将是您的Rate对象,您可以直接从xml中提取并实例化速率对象,然后访问Rate对象中的Mid属性 – miguelmpn

0

XML中的限定名由两部分组成:名称空间和本地名。在您的XML中,您的本地名称是Mid,但您的名称空间是而不是空:它是http://www.xignite.com/services/,如根元素中默认名称空间声明xmlns="..."所示。

如果你考虑到这一点,你会得到一个结果:

XNamespace ns = "http://www.xignite.com/services/"; 
var mid = (decimal)xDoc.Root.Element(ns + "Mid");