简单的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
将 <gpoint>
元素选择到变量中。
【讨论】:
【参考方案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解析的主要内容,如果未能解决你的问题,请参考以下文章