【问题标题】:simple xml parsing简单的xml解析
【发布时间】: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 中肯定有更简单的方法可以做到这一点?

【问题讨论】:

    标签: c# .net xml parsing


    【解决方案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
                {
                }
        

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多