2016-08-24 2 views
0

Я использую API xignite для получения данных обмена валюты в режиме реального времени. Когда я использую мои строки запроса:Получение содержимого элемента XML с использованием XDoc в C#

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 s есть null. Как получить доступ к содержимому элемента Mid с помощью XDoc?

ответ

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.

Edit: так как вы обновили свой вопрос с XML, я думаю, вы только не хватает пространства имен по запросу (НШ на мой запрос), пожалуйста, посмотрите на Чарльз Mager ответ

Мой ответ является другой подход. Вы сохраняете объект Rate и используете его без необходимости читать XML снова (вам нужно определить скорость в классе). Будьте осторожны со значениями, которые я сделал, вам нужно будет сопоставить ваш класс:)

+0

Я пытаюсь это, но у меня возникают проблемы с нс, рег и MyObject Что они? – user3711612

+0

Код в вопросе также использует LINQ to XML, и он не работает. Я не уверен, как общий пример поможет узнать, что не так с текущим кодом. –

+0

@ user3711612 произошла ошибка с моим предыдущим кодом, я исправил его ... MyObject в моем примере будет вашим объектом Rate, вы можете извлекать и создавать объекты скорости прямо из xml, а затем обращаться к средству Mid в объекте Rate – 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"); 
Смежные вопросы