2013-07-30 15 views
5

Bu yüzden bilinmeyen uzunlukta bir xml dosyası okuyorum ve her öğeyi bir liste yapısına okuyorum. Şu anda okumaya devam ettiğim dosyanın sonuna geldiğimde, bu bir istisna oluşturuyor. Şu anda sadece bu istisnayı yakaladım ve hayatımla devam ediyorum ama bunu yapmanın daha temiz bir yolu var mı?xml dosyasını okurken dosyanın sonu nasıl işlenir

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 dosyası:

<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

[XmlDocument] (http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx) veya [XDocument] kullanmadığınız herhangi bir nedenle (http://msdn.microsoft .com/en-us/library/system.xml.linq.xdocument.aspx) (.Net 3.5 erişiminiz varsa tercih edilir)? –

+0

nope sadece aşina değil – yawnobleix

+0

XML dosyanızın bir örneğini geçebilir misiniz? –

cevap

11
Ben zaten XML için bir TextReader beri senin durumda örneğin ... XML veri okumak için XDocument kullanarak tavsiye ediyorum

sadece içine geçebilir XDocument.Load yöntemi ... tüm fonksiyon yukarıda .. şöyle

var doc = XDocument.Load(textReader); 
foreach (var commandXml in doc.Descendants("Command")) 
{ 
    var command = new ATAPassThroughCommands(); 
    var name = commandXml.Descendants("Name").Single().Value; 
    // I'm not sure what this does but it looks important... 
    CommandListContext.Add(name); 
    command.m_Name = name; 
    command.m_CMD = 
     Convert.ToByte(commandXml.Descendants("CMD").Single().Value, 16); 
    command.m_Feature = 
     Convert.ToByte(commandXml.Descendants("Feature").Single().Value, 16); 
    m_ATACommands.Add(command); 
} 

Önemli ölçüde kolaylaştırır. Çerçevenin sizin için ağır kaldırmasına izin verin.

+0

mükemmel çalıştı Ben XDocument hakkında daha fazla bilgi edinmek için oldukça fazla zaman harcayacağım oldukça yararlı görünüyor gibi görünüyor – yawnobleix

+0

Kesinlikle öyle. Bu şekilde nasıl XML işlemek için bilgi aramak istiyorsanız, xml için linq denir. – Kevin

+0

Yardım için teşekkürler! – paqogomez

6

Normal ve uyumlu XML'iniz varsa, muhtemelen en kolay yolu XML Serializer'u kullanmaktır. Bu tam doğruysa

Önce demektir yok, 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 ; 
    } 
} 

emin değil dönmek için 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; } 
} 

bir yöntem maç nesneler oluştur Test et, ama gerçekten yakın olmalı.

+1

FYI, XML Serializer'ın '[Serializable]' özniteliğine ihtiyacı yoktur. –

+1

Anlaştık, ben onları seri hale getirmek istediğimde (ikili, xml, json, vb.) Sınıfları '[Serializeable] olarak işaretleme eğilimindeyim, diğer programcıların serileştirileceğini bilmelerini sağlar. Bu, değişiklik yapılması gerekiyorsa önlem almasına izin verir. Özellikle de, çökmüş kodlara bakmak isteyen programcılar (benim gibi) sınıfın içinde kontrol edilmeden serileştirilebildiğini söyleyebilirim. –

İlgili konular