Efter en så uttömmande rubrik så kommer som vanligt ett nybörjar inlägg... oj vad jobbig kod att läsa... :) Jag hittade felet själv.Behöver lite hjälp...
Jag håller på med ett litet program för att titta på GPS loggar.
Använder följande funktion för att läsa in data från en GPX fil
<code>
public GPXtrkType read(string file)
{
GPXwptType wpt = new GPXwptType();
GPXtrksegType trkseg = new GPXtrksegType();
GPXtrksegType trksegStore = new GPXtrksegType();
GPXtrkType trk = new GPXtrkType();
XmlNodeReader reader = null;
bool trksegRead = false;
string split = "\\";
string[] names;
string fullPath;
names = file.Split(split.ToCharArray());
if ( names.Length > 1 )
{
for( int i = 0; i < names.Length-1;i++ )
{
sPath += names[i];
sPath += "\\";
}
}
// olika varianter av filnamn
sFileName = names[names.Length-1];
trk.fileName = sFileName;
trk.path = sPath;
fullPath = sPath+sFileName;
//inställningar för filläsaren
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
settings.IgnoreWhitespace = true;
settings.IgnoreComments = true;
try
{
//Create an XmlNodeReader to read the XmlDocument.
XmlDocument doc = new XmlDocument();
doc.Load(fullPath);
reader = new XmlNodeReader(doc);
//läs igenom alla noder
while (reader.Read())
{
// hämtar spårets namn
if (reader.Name == "name")
{
trk.name = reader.ReadInnerXml();
}
// hämtar spårets beskrivning
if (reader.Name == "desc")
{
trk.desc = reader.ReadInnerXml();
}
//Varje fil kan ha flera traksegment
if (reader.Name == "trkseg")
{
trksegRead = true;
}
while (trksegRead)
{
//lat och lon ligger som attribut till trackpoint
if (reader.Name == "trkpt")
{
wpt.lat = Decimal.Parse(reader.GetAttribute("lat").Replace(".",","));
wpt.lon = Decimal.Parse(reader.GetAttribute("lon").Replace(".",","));
reader.Read();
}
//Varje trakpoint Kan ha ele och time som underelement
if (reader.Name == "ele")
{
wpt.ele = Decimal.Parse(reader.ReadInnerXml().Replace(".",","));
}
if ( reader.Name == "time")
{
wpt.setTime(reader.ReadInnerXml());
}
if (wpt.lat != 0 )
trkseg.addWptLast(wpt);
wpt = null;
wpt = new GPXwptType();
reader.Read();
// om vi hittar en till tracksegment så hoppar vi ur och börjar om
if (reader.Name == "trkseg"){
trksegRead = false;
}
}// end while trksegRead
if ( trkseg.countWpt() > 0 )
{
trksegStore.setWptList( trkseg.getwptList() );
trk.addTrksegLast(trksegStore);
}
trkseg = null;
trkseg = new GPXtrksegType();
trksegStore = null;
trksegStore = new GPXtrksegType();
}// end while reader.read
}
catch ( Exception e)
{
Console.WriteLine(e.ToString());
}
finally
{
if (reader!=null)
reader.Close();
}
return trk;
}
</code>
Mitt problem är att det funkar helt ok första gången.
Den andra gången byggs inte objektet track upp. Jag kan inte plock ut informationen ur det.
Om jag kommenterar bort if( reader != null ) i finally stycket så krachar programet andra gången jag läser in en fil.
Funktionen anropas via ett "knapp event"
if ( dlg.ShowDialog() == DialogResult.OK )
{
//läs in filen
track = re.read(dlg.FileName);
...
se sätter jag texten i några lables mha tex track.name
Tar tacksamt emot hjälp.
Har försökt söka info på egen hand men med ett så diffust problem är det svårt att söka
/TobiasSv: Behöver lite hjälp...
Jag fastna på ditt påstående om
"Mitt problem är att det funkar helt ok första gången.
Den andra gången byggs inte objektet track upp. Jag kan inte plock ut informationen ur det."
Det jag reagerar på är att du i din while-loop (reader.read()) sätter trk.Name med information från din xml-nod, men eftersom det alltid är samma trk-objekt så kommer du endast att skicka tillbaka information från den sista noden i ditt xml-objekt. Finns det noder innan som innehåller data så kommer dessa att skrivas över vid varje ny läsning.
Kanske det kan vara något...
- MSv: Behöver lite hjälp...
Variabeln sPath var deklarerad för hela klassen så den dubblerades.
Jag började med programmet i en konsoleversion och då använde jag spath för att komma ihåg arbetskatalogen.
Sen hade jag en console.writeline i catch blocket som gjorde att jag inte så felmedelandet när jag gick över till GUI.
när det gäller att skriva över namnet så defineras GPX schemat ( http://www.topografix.com/GPX/1/1/#type_trkType ) så att det får finnas 0 eller 1 namn, så den här gången ställer det inte till det.
Men du ska bara veta hur många gånger jag har skrivit över min egen info :)
Som sagt nybörjare...
TAck för hjälpen och hoppas att jag inte retat upp alltför många med mina bekymmer
Tobias