C# XMLreader,不进入 if 语句来读取元素
C# XMLreader, not going into if statement to read element
我有一个读取 gpx 文件的 C# 程序,
我将每个元素都放在一个变量中,最后我将所有这些元素放在一个对象中。
对于所有这些元素我都有函数,所以每个函数读取一个标签,我用这个 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 语句(我的消息框没有弹出)
但是,如果我将 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 文件和 returns 最后一个元素。如果我不包括 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>
我希望我已经足够清楚地解释了我的问题,希望有人会花时间阅读并帮助我。 :D
XmlReader
是只读,只有当你调用 .Read()
时它才会前进 - 所以这就是你的程序当前正在做的事情(假设 Coordinates
构造函数采用 XmlReader
用于解析 trkpt
元素):
- 为文件创建Reader
- 对于文件中的每个节点(元素、文本、属性),运行 尝试获取坐标、元素并创建您的
GPXDataObject
的代码。
- Return 这些部分 GPXDataObject 的列表(一个循环得到 lat/long,一个循环得到速度,一个循环得到时间,等等)。
以下是您可能想要的更多内容:
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);
}
}
这至少应该让你入门。
我有一个读取 gpx 文件的 C# 程序, 我将每个元素都放在一个变量中,最后我将所有这些元素放在一个对象中。 对于所有这些元素我都有函数,所以每个函数读取一个标签,我用这个 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 语句(我的消息框没有弹出) 但是,如果我将 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 文件和 returns 最后一个元素。如果我不包括 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>
我希望我已经足够清楚地解释了我的问题,希望有人会花时间阅读并帮助我。 :D
XmlReader
是只读,只有当你调用 .Read()
时它才会前进 - 所以这就是你的程序当前正在做的事情(假设 Coordinates
构造函数采用 XmlReader
用于解析 trkpt
元素):
- 为文件创建Reader
- 对于文件中的每个节点(元素、文本、属性),运行 尝试获取坐标、元素并创建您的
GPXDataObject
的代码。 - Return 这些部分 GPXDataObject 的列表(一个循环得到 lat/long,一个循环得到速度,一个循环得到时间,等等)。
以下是您可能想要的更多内容:
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);
}
}
这至少应该让你入门。