C#XMLreader,不进入if语句来读取元素

本文关键字:语句 读取 元素 if C#XMLreader | 更新日期: 2023-09-27 18:27:48

我有一个C#程序,它读取gpx文件,我把每个元素都放在一个变量中,最后我把所有这些元素都放进一个对象中。对于所有这些元素,我都有函数,所以每个函数都读取一个标签,我用if语句来完成:

        public double GetEle(XmlReader reader)
    {
            if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "ele"))
            {
                MessageBox.Show(Convert.ToString(reader.ReadElementContentAsDouble()));
                double value = reader.ReadElementContentAsDouble();
                return Math.Round(value, 2);
            }
        return 0;
    }

问题是我的程序永远不会进入if语句(我的messageBox不会弹出)但是,如果我把if语句放在这个循环中↓ .然后我的程序进入我所有的if语句。

                while (reader.Read())
            {}

我的问题是,我在调用GetEle()函数的函数中使用了while(reader.Read())。所以我不想循环使用我的GetEle()函数,只运行一次:

        public List<GPXDataObject> Extract(string path)
    {
        if (path == String.Empty)
        {
            throw new ArgumentOutOfRangeException("path");
        }
        if (path == null)
        {
            throw new ArgumentNullException("path");
        }
        List<GPXDataObject> gpxDataList = new List<GPXDataObject>();
        using (XmlReader reader = XmlReader.Create(path))
        {
            while (reader.Read())
            {
                List<double> coordinates = Coordinates(reader);
                double lat = coordinates[0];
                double lon = coordinates[1];
                double ele = GetEle(reader);
                DateTime date = GetDate(reader);
                float speed = GetSpeed(reader);
                float azimuth = GetAzimuth(reader);
                GPXDataObject gpxDataObject = new GPXDataObject(lat, lon, ele, date, speed, azimuth);
                gpxDataList.Add(gpxDataObject);
            }
            reader.Close();
        }
        return gpxDataList;
    }

我在所有的函数中都有这个问题,如果我使用while(reader.read()),函数可以工作,但在整个gpx文件中循环并返回最后一个元素。如果我不包含while循环,我的程序就永远不会进入If语句。

  • 为什么我的GetEle函数没有while循环就不能工作?(我的主函数中有while循环)
  • 如何修复

以下是我的xml数据示例:

<trk>
<trkseg>
    <trkpt lat="47.021897" lon="9.965247">
        <ele>811.90</ele>
        <time>2015-02-18T07:17:25.01Z</time>
        <extensions>
            <gte:gps speed="2.1" azimuth="42.9"/>
        </extensions>
    </trkpt>
    <trkpt lat="47.021896" lon="9.965999">
        <ele>812.19</ele>
        <time>2015-02-18T07:17:25.21Z</time>
        <extensions>
            <gte:gps speed="2.0" azimuth="44.3"/>
        </extensions>
    </trkpt>
    <trkpt lat="47.021890" lon="9.965241">
        <ele>812.53</ele>
        <time>2015-02-18T07:17:25.41Z</time>
        <extensions>
            <gte:gps speed="1.5" azimuth="48.0"/>
        </extensions>
    </trkpt>
    <trkpt lat="47.021885" lon="9.965238">
        <ele>812.49</ele>
        <time>2015-02-18T07:17:25.61Z</time>
        <extensions>
            <gte:gps speed="1.2" azimuth="58.7"/>
        </extensions>
    </trkpt>
</trkseg>

我希望我把我的问题解释得足够清楚,有人会花时间通读并帮助我

XmlReader是仅向前读取的,只有当您调用.Read()时它才会前进-因此,以下是您的程序当前正在执行的操作(假设接受XmlReaderCoordinates构造函数用于解析trkpt元素):

  1. 为文件创建读取器
  2. 对于文件中的每个节点(元素、文本、属性),运行尝试获取坐标、元素并创建GPXDataObject的代码
  3. 返回这些部分GPXDataObjects的列表(一个循环得到lat/long,一个循环获得speed,一个环路获得time,等等)

以下是您可能想要的更多信息:

using (XmlReader reader = XmlReader.Create(path))
{
    reader.MoveToContent();
    while (reader.ReadToFollowing("trkpt")) // advance the reader to the next trkpt element
    {
        List<double> coordinates = Coordinates(reader);
        double lat = coordinates[0];
        double lon = coordinates[1];
        reader.ReadToFollowing("ele"); // reader.Read() might work here, depending on what state Coordinates left the reader in
        double ele = GetEle(reader);
        reader.ReadToFollowing("time");
        DateTime date = GetDate(reader);
        reader.ReadToFollowing("extensions"); // note: it's not clear what GetSpeed and GetAzimuth need - do they expect the reader to be on the extensions element or the gte:gps element?
        float speed = GetSpeed(reader);
        float azimuth = GetAzimuth(reader);
        GPXDataObject gpxDataObject = new GPXDataObject(lat, lon, ele, date, speed, azimuth);
        gpxDataList.Add(gpxDataObject);
    }         
}

这至少应该让你开始。

C#XMLreader,不进入if语句来读取元素