простой разбор xml - PullRequest
       26

простой разбор xml

7 голосов
/ 16 февраля 2009

что является самым простым способом для разбора lat и long из следующего фрагмента xml. Там нет пространства имен и т. Д.

Это строковая переменная. не поток.

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

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

Я смотрел по ссылке выше

Конечно, есть более простой способ сделать это в .net?

Ответы [ 5 ]

18 голосов
/ 16 февраля 2009

Использование 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(); 
7 голосов
/ 16 февраля 2009
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> в переменную.

4 голосов
/ 16 февраля 2009

Даже проще, чем ответ Митча Уита, поскольку рассматриваемый фрагмент является правильно оформленным 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);
3 голосов
/ 16 февраля 2009

Если вы можете использовать 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 в качестве широты.

2 голосов
/ 10 января 2014

Используйте для этого метод 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
        {
        }

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...