首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中使用XDoc获取XML元素的内容

在C#中使用XDoc获取XML元素的内容
EN

Stack Overflow用户
提问于 2016-08-25 01:38:31
回答 2查看 93关注 0票数 0

我正在使用xignite API来获取实时货币兑换数据。当我使用查询字符串时:

代码语言:javascript
复制
http://globalcurrencies.xignite.com/xGlobalCurrencies.xml/GetRealTimeRate?Symbol=GBPEUR&_token=[mytoken]

我得到了以下信息:

代码语言:javascript
复制
<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元素的内容,到目前为止,我正在这样做

代码语言:javascript
复制
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的内容?

EN

回答 2

Stack Overflow用户

发布于 2016-08-25 01:42:14

我使用Linq to XML,下面是一个例子

代码语言:javascript
复制
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将包含一个来自XML文件的MyObjects数组。

编辑:由于您使用XML更新了问题,因此我认为您只缺少查询中的名称空间(我的查询中的ns ),请查看Charles Mager answer

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

票数 0
EN

Stack Overflow用户

发布于 2016-08-25 16:14:52

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

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

代码语言:javascript
复制
XNamespace ns = "http://www.xignite.com/services/";
var mid = (decimal)xDoc.Root.Element(ns + "Mid");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39129746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档