【问题标题】:Read XML to a list<string[]> using xmlread使用 xmlread 将 XML 读取到列表<string[]>
【发布时间】:2014-07-08 20:58:39
【问题描述】:

我将读取一个 gps 指向列表的 xml 文件,然后将它们转换为多边形并保存在数据库中。 这是我的问题..当我尝试读取文件时,列表中的每个项目都与其他项目相同..你能帮我解决我的问题吗?谢谢 这是我的代码:

  public List<string[]> loadXML(string xmlpath)
    {

        List<string[]> points = new List<string[]>();

        XmlReader xmlReader = XmlReader.Create(xmlpath);
        while (xmlReader.Read())
        {
            string[] item = new string[3];
            if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "trkpt"))
            {
                if (xmlReader.HasAttributes) 
                {

                    item[0] = xmlReader.GetAttribute("lat");
                    item[1] = xmlReader.GetAttribute("lon");

                }


            }
            if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "ele"))
            {


                    item[2] = xmlReader.ReadInnerXml();


            }
            points.Add(item);

        }
        return points;
    }

这是我的 xml 的一部分:

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="" xmlns:gpxx="" xmlns:wptx1="" xmlns:gpxtpx="" creator="GPSMAP 78s" version="1.1" xmlns:xsi="" xsi:schemaLocation="">
<metadata>
<link href=""><text>Garmin International</text></link>
<time>2014-06-18T13:55:07Z</time></metadata>
<trk><name>PV164B2KHE</name>
<extensions><gpxx:TrackExtension><gpxx:DisplayColor>Cyan</gpxx:DisplayColor></gpxx:TrackExtension></extensions>
<trkseg>
<trkpt lat="31.0403929744" lon="51.5264290944"><ele>2089.08</ele><time>2014-06-18T13:45:57Z</time></trkpt>
<trkpt lat="31.0403881129" lon="51.5264252387"><ele>2088.60</ele><time>2014-06-18T13:46:01Z</time></trkpt></trkseg></trk></gpx>

我想为每个点提取 lat,lon 和 ele

【问题讨论】:

  • 为自己省点心,使用 XDocument.Load(xmlpath)。您可以使用 System.Xml.Linq 查询和检索您需要的元素。
  • @Darek 正如我在 xDocument 方法消耗的内存比 xml 读取之前所读到的那样。您对此有何看法?没有任何建议为什么会发生在我的代码中?

标签: c# xml xmlreader


【解决方案1】:

我会为此使用 Linq to XML:

var xmlDocument = XDocument.Load("path");

XNamepsace ns = xmlDocument.Root.GetDefaultNamespace();
var values = xmlDocument.Root
             .Descendants(ns + "trkpt")
             .Select(x => new
                    {
                        lat = (string)x.Attribute("lat"), 
                        lon = (string)x.Attribute("lon"), 
                        ele = (string)x.Element(ns + "ele")
                    });

您的错误是xmlReader.Read() 读取下一个节点,但是您正在为每个节点创建一个string[] 数组。一个节点不能同时是trkptele。所以这永远不会给你想要的结果。

【讨论】:

  • @user3818085 尝试在 Select 之后添加 ToList()
  • 我已经测试了您的新编辑,但这里出现错误'XNamepsace ns = xmlDocument.Root.GetDefaultNamespace();'它说它不能转换类型 System.Xml.Linq.xnamespsace
  • 它找不到任何定义..有什么我必须添加的用法吗?或者拼写错误或类似的东西?我认为正确的拼写是XNamespace 我会测试一下让你知道结果
  • @MajidHojati 也将命名空间添加到 ele ele = (string)x.Element(ns + "ele")
  • 我找到了解决方案..我使用了ele = (string)x.Elements().First(),它工作正常..如果我想从 xml 中提取 name 怎么办?我必须编写一个新查询吗?
猜你喜欢
  • 2015-01-05
  • 1970-01-01
  • 2019-11-23
  • 2018-06-07
  • 2017-07-11
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多