2016-04-12 6 views
2

У меня есть следующий XML-файл из API,Получение значений из XML - C#

<IPInformation xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ws.cdyne.com/"> 
<City>xxxxxx</City> 
<StateProvince>12</StateProvince> 
<Country>xxxxxx</Country> 
<Organization/> 
<Latitude>13.0833</Latitude> 
<Longitude>80.28329</Longitude> 
<AreaCode>0</AreaCode> 
<TimeZone/> 
<HasDaylightSavings>false</HasDaylightSavings> 
<Certainty>90</Certainty> 
<RegionName/> 
<CountryCode>xx</CountryCode> 
</IPInformation> 

Мне нужно получить значения Latitude и Longitude сверху XML и сохранить его в виде строки.

Я работаю на C# .NET 3.5 рамки, я попытался код ниже,

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(response.GetResponseStream()); 
location = xmlDoc.DocumentElement.SelectSingleNode("//City"); 
latitude = xmlDoc.DocumentElement.SelectSingleNode("//Latitude"); 

Я всегда получаю Null вместо 13.0833 и 80.28329.

Может ли кто-нибудь рассказать мне, как получить значения Latitude и Longitude значений выше xml.

Thanks

+1

Deserialize к объекту типа IPInformation .. Используйте способ ООП. –

+0

Хорошая точка; однако он не объясняет, почему метод curren работает не так, как ожидалось. – Codor

+1

Каков тип переменных «широта» и «долгота»? Метод 'SelectSingleNode' не анализирует содержимое выбранного узла; его тип возврата - 'XmlNode', который должен быть продолжен для достижения синтаксического анализа. – Codor

ответ

4

Ваша проблема - пространство имен. Я скопировал свой XML в a.xml и последующих работ (LINQPad):

void Main() 
{ 
    var a = @"c:\temp\a\a.xml"; 
    XmlDocument x = new XmlDocument(); 
    x.Load(a); 

    var ns = new XmlNamespaceManager(x.NameTable); 
    ns.AddNamespace("x", x.DocumentElement.NamespaceURI); 
    x.DocumentElement.SelectSingleNode("//x:Longitude", ns).Dump(); 

} 

гравюр

<Longitude xmlns="http://ws.cdyne.com/">80.28329</Longitude> 
+0

Я получаю следующую ошибку при сборке приложения «Ошибка» System.Xml. XmlNode 'не содержит определения для «Дамп», и не может быть найден метод расширения «Дамп», принимающий первый аргумент типа «System.Xml.XmlNode» (вам не хватает директивы using или ссылки на сборку?) « – user2681579

+0

' Dump' - это команда LINQPad. Попробуйте запустить 'Console.WriteLine (x.DocumentElement.SelectSingleNode (" // x: Longitude ", ns))' или 'Console.WriteLine (x.DocumentElement.SelectSingleNode (" // x: Longitude ", ns) .InnerText) ; ' – rbm

+0

xmlDoc.DocumentElement.SelectSingleNode (" // x: Longitude ", ns) .InnerXml.ToString(); - работал на меня. – user2681579

0

Для начала у вас есть два XMLNS декларации атрибута в вашем XML - если вы удалите xmlns="http://ws.cdyne.com/" и изменить свой запрос /IPInformation/Latitude, который возвращает действительный XMLNode.

+0

Нет, нет двух атрибутов xmlns. «Xmlns» - это пространство имен по умолчанию. – rbm

Смежные вопросы