2009-02-16 6 views
7

Простейший способ проанализировать lat и long из следующего фрагмента xml. Нет пространства имен и т.д.простой xml синтаксический анализ

Он находится в строковой переменной. а не поток.

<poi> 
     <city>stockholm</city> 
     <country>sweden</country> 
     <gpoint> 
     <lat>51.1</lat> 
     <lng>67.98</lng> 
     </gpoint> 
</poi> 

все, что я читал до сих пор является waaaaay слишком сложным для того, что должно быть простой задачей например http://geekswithblogs.net/kobush/archive/2006/04/20/75717.aspx

Я искал по ссылке выше

Наверняка есть более простой способ сделать это в .net?

ответ

7
using System.IO; 
using System.Xml; 
using System.Xml.XPath; 

. , ,

string xml = @"<poi>  
        <city>stockholm</city> 
        <country>sweden</countr> 
         <gpoint>   
          <lat>51.1</lat>   
          <lng>67.98</lng>  
         </gpoint> 
        </poi>"; 

    XmlReaderSettings set = new XmlReaderSettings(); 
    set.ConformanceLevel = ConformanceLevel.Fragment; 

    XPathDocument doc = 
     new XPathDocument(XmlReader.Create(new StringReader(xml), set)); 

    XPathNavigator nav = doc.CreateNavigator(); 


    Console.WriteLine(nav.SelectSingleNode("/poi/gpoint/lat")); 
    Console.WriteLine(nav.SelectSingleNode("/poi/gpoint/lng")); 

Конечно, вы можете использовать XPath SelectSingleNode для выбора <gpoint> элемента в переменный.

+0

большое спасибо - это гораздо более прямолинейно – ChrisCa

17

Использование Linq для XML:

XDocument doc= XDocument.Parse("<poi><city>stockholm</city><country>sweden</country><gpoint><lat>51.1</lat><lng>67.98</lng></gpoint></poi>"); 

    var points=doc.Descendants("gpoint"); 

    foreach (XElement current in points) 
    { 
     Console.WriteLine(current.Element("lat").Value); 
     Console.WriteLine(current.Element("lng").Value); 
    } 

    Console.ReadKey(); 
+1

+1. Nice 3.5 version ... –

3

Если вы можете использовать LINQ для XML вы можете прочитать эти два значения сразу вперед, как это:

var doc = XDocument.Parse("..."); 
var point = doc.Element("poi").Element("gpoint"); 
Console.WriteLine("Lat: {0}, Lng: {1}", 
    point.Element("lat").Value, 
    point.Element("lng").Value); 

Если вы нуждаетесь в них, как удваивать вы должны конвертировать их:

double lat = Convert.ToDouble(point.Element("lat").Value, 
       CultureInfo.InvariantCulture); 

Не забудьте указать культуру, в которой используется точка для фракций. В противном случае это даст 511.0 как широту.

+0

Это одобренный подход, но я предпочитаю Descendents, потому что он меньше зависит от структуры документа и может быть менее вероятным сбой, если бы произошли изменения. – Ash

4

Даже проще, чем ответ Митч пшеницы, так как рассматриваемый фрагмент представляет собой хорошо сформированный XML документ:

метод
using System.Xml; 
using System.IO; 

... 

string xml = @"<poi> 
        <city>stockholm</city> 
        <country>sweden</country> 
        <gpoint> 
        <lat>51.1</lat> 
        <lng>67.98</lng> 
        </gpoint> 
       </poi>"; 

XmlDocument d = new XmlDocument(); 
d.Load(new StringReader(xml)); 
Console.WriteLine(d.SelectSingleNode("/poi/gpoint/lat").InnerText); 
Console.WriteLine(d.SelectSingleNode("/poi/gpoint/lng").InnerText); 
1

Использование XElement.Parse (строка текста), чтобы сделать это.

Пример:

string xmlString = @"<poi> 
       <city>stockholm</city> 
       <country>sweden</country> 
       <gpoint> 
       <lat>51.1</lat> 
       <lng>67.98</lng> 
       </gpoint> 
      </poi>"; 
     try 
     { 
      XElement x = XElement.Parse(xmlString); 
      var latLng = x.Element("gpoint"); 

      Console.WriteLine(latLng.Element("lat").Value); 
      Console.WriteLine(latLng.Element("lng").Value); 
     } 
     catch 
     { 
     } 

Надеется, что это помогает!

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