【问题标题】:Getting the contents of an XML element using XDoc in C#在 C# 中使用 XDoc 获取 XML 元素的内容
【发布时间】:2016-08-24 17:38:31
【问题描述】:

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

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 的内容?

【问题讨论】:

    标签: c# xml xdoc


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我用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 将包含来自 XML 文件的 MyObjects 数组。

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

      我的答案是另一种方法。您保存 Rate 对象并使用它,而无需再次读取 XML(您需要在类中定义 Rate) 小心我所做的价值转换,你需要匹配你的班级:)

      【讨论】:

      • 我正在尝试这个,但我在使用 ns、reg 和 MyObject 时遇到了问题,它们是什么?
      • 问题中的代码也使用了 LINQ to XML,但它不起作用。我不确定一个通用示例将如何帮助发现当前代码的问题。
      • @user3711612 我之前的代码有错误,我已修复它...在我的示例中,MyObject 将是您的 Rate 对象,您可以直接从 xml 中提取和实例化 rate 对象,然后访问Rate 对象中的 Mid 属性
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多