2013-07-30 9 views
5

Also ich lese eine XML-Datei mit unbekannter Länge und liest jedes Element in eine Listenstruktur. Jetzt, wenn ich am Ende der Datei angelangt bin, lese ich weiter, das verursacht eine Ausnahme. Gerade jetzt fange ich diese Ausnahme und fahre mit meinem Leben fort, aber gibt es einen saubereren Weg, dies zu tun?So behandeln Sie das Ende der Datei beim Lesen der XML-Datei

try 
{ 
    while(!textReader.EOF) 
    { 
     // Used to store info from each command as they are read from the xml file 
     ATAPassThroughCommands command = new ATAPassThroughCommands();      
     // the following is just commands being read and their contents being saved 
     XmlNodeType node = textReader.NodeType;            

     textReader.ReadStartElement("Command"); 
     node = textReader.NodeType; 
     name = textReader.ReadElementString("Name"); 
     node = textReader.NodeType; 
     CommandListContext.Add(name); 
     command.m_Name = name; 
     command.m_CMD = Convert .ToByte(textReader.ReadElementString("CMD"),16); 
     command.m_Feature = Convert .ToByte(textReader.ReadElementString("Feature"),16); 

     textReader.ReadEndElement(); //</command> 
     m_ATACommands.Add(command); 
    } 
} 
catch (Exception ex) 
{ 
    //</ATAPassThrough> TODO: this is an ugly fix come up with something better later 
    textReader.ReadEndElement(); 
    //cUtils.DisplayError(ex.Message); 
} 

XML-Datei:

<ATAPassThrough> 
    <Command> 
    <Name>Smart</Name> 
    <CMD>B0</CMD> 
    <Feature>D0</Feature> 
    </Command> 
    <Command> 
    <Name>Identify</Name> 
    <CMD>B1</CMD> 
    <Feature>D0</Feature> 
    </Command> 
    . 
    . 
    . 
    . 
</ATAPassThrough> 
+4

Jeder Grund, warum Sie [XmlDocument] nicht verwenden (http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx) oder [XDocument] (http://msdn.microsoft.com) .com/de-us/library/system.xml.linq.xdocument.aspx) (bevorzugt, wenn Sie Zugriff auf .Net 3.5 haben)? –

+0

nein, nur nicht vertraut mit ihm – yawnobleix

+0

Können Sie ein Beispiel für Ihre XML-Datei? –

Antwort

11

ich empfehlen würde XDocument mit für XML-Daten zu lesen ... zum Beispiel in Ihrem Fall, da Sie bereits einen Textreader für Ihre XML haben, können Sie nur, dass in den Pass XDocument.Load Methode ... Ihre gesamte oben genannte Funktion sieht so aus ..

Deutlich einfacher. Lassen Sie den Rahmen das schwere Heben für Sie erledigen.

+0

funktionierte perfekt Ich werde wahrscheinlich einige Zeit damit verbringen, mehr über XDocument zu lernen, da es ziemlich nützlich scheint – yawnobleix

+0

Es ist definitiv. Dies wird linq to xml genannt, wenn Sie nach Informationen darüber suchen möchten, wie Sie XML auf diese Weise bearbeiten können. – Kevin

+0

Danke für die Hilfe! – paqogomez

6

Wahrscheinlich der einfachste Weg, wenn Sie normale und konsistente XML haben, ist die Verwendung der XML Serializer.

Erste Objekte erstellen, die XML-

[Serializable()] 
public class Command 
{ 
    [System.Xml.Serialization.XmlElement("Name")] 
    public string Name { get; set; } 

    [System.Xml.Serialization.XmlElement("CMD")] 
    public string Cmd { get; set; } 

    [System.Xml.Serialization.XmlElement("Feature")] 
    public string Feature { get; set; } 
} 

[Serializable()] 
[System.Xml.Serialization.XmlRoot("ATAPassthrough")] 
public class CommandCollection 
{ 
    [XmlArrayItem("Command", typeof(Command))] 
    public Command[] Command { get; set; } 
} 

Die eine Methode entsprechen der CommandCollection

public class CommandSerializer 
{ 
    public commands Deserialize(string path) 
    { 
    CommandCollection commands = null; 

    XmlSerializer serializer = new XmlSerializer(typeof(CommandCollection)); 

    StreamReader reader = new StreamReader(path); 
    reader.ReadToEnd(); 
    commands = (CommandCollection)serializer.Deserialize(reader); 
    reader.Close(); 

    return commands ; 
    } 
} 

Nicht sicher zurückzubringen, wenn dies genau richtig, ich habe nicht die Mittel, um teste es, aber sollte wirklich nah sein.

+1

FYI, der XML-Serializer benötigt das '[Serializable]' - Attribut nicht. –

+1

Vereinbart, ich neige dazu, Klassen als '[Serializeable]' zu markieren, wenn ich beabsichtige, sie zu serialisieren (binary, xml, json, etc), können andere Programmierer wissen, dass es serialisiert wird. So können sie Vorkehrungen treffen, wenn Änderungen erforderlich sind. Vor allem, wenn Programmierer (wie ich) kollabierten Code betrachten, kann ich sagen, dass er in der Lage sein sollte, serialisiert zu werden, ohne die Klasse zu überprüfen. –

Verwandte Themen