简单的xml解析

Posted

技术标签:

【中文标题】简单的xml解析【英文标题】:simple xml parsing 【发布时间】:2010-10-07 19:42:42 【问题描述】:

从以下 xml 片段中解析 lat 和 long 的最简单方法是什么。没有命名空间等。

它在一个字符串变量中。不是流。

<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 中肯定有更简单的方法可以做到这一点?

【问题讨论】:

【参考方案1】:

为 XML 使用 Linq:

   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(); 

【讨论】:

【参考方案2】:
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&lt;gpoint&gt; 元素选择到变量中。

【讨论】:

【参考方案3】:

甚至比 Mitch Wheat 的回答更简单,因为所讨论的片段是格式良好的 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);

【讨论】:

你也可以取消new StringReader,直接使用d.LoadXml(xml)【参考方案4】:

如果您可以将 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 作为纬度。

【讨论】:

这是一个不错的方法,但我更喜欢 Descendents,因为它对文档结构的依赖性较小,并且如果发生更改,失败的可能性也较小。【参考方案5】:

使用 XElement.Parse(string text) 方法来做到这一点。

例子:

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
        
        

希望这会有所帮助!

【讨论】:

以上是关于简单的xml解析的主要内容,如果未能解决你的问题,请参考以下文章

xml文件操作

解析简单xml文档

DOM的概念和简单应用:使用DOM解析XML数据

XML 解析 - 读取一个简单的 XML 文件并检索值

简单的xml解析

domSAXJdomdom4j四种解析xml方式简单总结