2016-04-02 36 views
0

Önceden yazılmış XML dosyasını okuması gereken bir C# WinForm uygulaması yazıyorum. XML dosyasını ayrıştırmak ve XML dosya içeriğini yansıtmak için bir veri yapısı oluşturmam gerekiyor. XML serileştirme işleminde bazı deneyimim var ve bu nedenle .NETXML.Serialization özelliklerini kullanmayı öğrendim. ben (vb oluk nitelikleri, elementler ve) sınıfı içinde eşleştiremediğimiz olduğum garip XML yapısında saplanıp: BununC# XML Serileştirme içlenmemiş diziler/liste

<sheet number="1" name="/" tstamps="/"> 
    <title_block> 
    <title>ECC Push-Pull</title> 
    <company/> 
    <rev>0.1</rev> 
    <date>Sat 21 Mar 2015</date> 
    <source>ecc83-pp.sch</source> 
    <comment number="1" value=""/> 
    <comment number="2" value=""/> 
    <comment number="3" value=""/> 
    <comment number="4" value=""/> 
    </title_block> 
</sheet> 

'garip' kısmı yorumların listesidir. XmlArray yönergesiyle bir listenin/dizinin bir dizisinin serileştirilmesi sonucunda böyle 'tekrarlanan' öğeler bulmaya alışığım. Böyle bir yaklaşımın kullanılması, yine de, eşyaların listesini içerecek bir surviuding etiketi getirecektir. Bu durumda bu yapıyı nasıl yansıtabilirim?

[XmlRoot("sheet")] 
public class Sheet 
{ 
    [XmlAttribute("number")] 
    public int Number { get; } 

    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlAttribute("tstamps")] 
    public UInt32 TimeStamps { get; set; } 

    [XmlElement] 
    public SheetTitle Title { get; set; } 

    public Sheet() 
    { 
     Title = new SheetTitle(); 
    } 
} 


[XmlRoot("title_block")] 
public class SheetTitle 
{ 
    [XmlElement("title")] 
    public string Title { get; set; } 

    [XmlElement("company")] 
    public string Company { get; set; } 

    [XmlElement("rev")] 
    public string Revision { get; set; } 

    [XmlElement("date")] 
    public DateTime Date { get; set; } 

    [XmlElement("source")] 
    public string Source { get; set; } 

    public SheetTitle() 
    { 
     Date = DateTime.Now; 
    } 
} 

[XmlRoot("comment")] 
public class Comment 
{ 
    [XmlAttribute("number")] 
    public int Number { get; set; } 

    [XmlAttribute("value")] 
    public string Value { get; set; } 
} 

başka yan sorum var: Bu benim ('kayıp' yorumsuz) kullanmalıdır kod. Bu yapıyı yansıtan en iyi sınıf hiyerarşisi: a) sınıfları xml öğeleri ile aynı şekilde yerleştirmek b) tüm sınıfları aynı düzeyde tutmak (bir hiyerarşi olmadan)? Dikkat edilmesi gereken yan etkiler var mı?

+0

Biz Sorunun ortadan kalktığını umut .... sonra dezerializedXML denilen bir nesneye dezerialize (uygulamadan * .exe klasöründe xml.xml denir) dosyasından xml okur . Değilse, belki sorunuzun güncellenmesi hakkında düşünün .... http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – Monty

+0

ben tatil için oldum yakında kontrol edecek – weirdgyn

cevap

1

bu deneyin ...

usings

using System.Collections.Generic; 
using System.IO; 
using System.Text; 
using System.Xml; 
using System.Xml.Serialization; 

Sınıflar

[XmlRoot(ElementName = "comment")] 
public class Comment 
{ 
    [XmlAttribute(AttributeName = "number")] 
    public string Number { get; set; } 
    [XmlAttribute(AttributeName = "value")] 
    public string Value { get; set; } 
} 

[XmlRoot(ElementName = "title_block")] 
public class Title_block 
{ 
    [XmlElement(ElementName = "title")] 
    public string Title { get; set; } 
    [XmlElement(ElementName = "company")] 
    public string Company { get; set; } 
    [XmlElement(ElementName = "rev")] 
    public string Rev { get; set; } 
    [XmlElement(ElementName = "date")] 
    public string Date { get; set; } 
    [XmlElement(ElementName = "source")] 
    public string Source { get; set; } 
    [XmlElement(ElementName = "comment")] 
    public List<Comment> Comment { get; set; } 
} 

[XmlRoot(ElementName = "sheet")] 
public class Sheet 
{ 
    [XmlElement(ElementName = "title_block")] 
    public Title_block Title_block { get; set; } 
    [XmlAttribute(AttributeName = "number")] 
    public string Number { get; set; } 
    [XmlAttribute(AttributeName = "name")] 
    public string Name { get; set; } 
    [XmlAttribute(AttributeName = "tstamps")] 
    public string Tstamps { get; set; } 
} 

Kod

try 
{ 
    XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.Load("xml.xml"); 

    string XML = xmlDoc.InnerXml.ToString(); 
    byte[] BUFXML = ASCIIEncoding.UTF8.GetBytes(XML); 
    MemoryStream ms1 = new MemoryStream(BUFXML); 

    XmlSerializer DeserializerPlaces = new XmlSerializer(typeof(Sheet)); 
    using (XmlReader reader = new XmlTextReader(ms1)) 
    { 
     Sheet dezerializedXML = (Sheet)DeserializerPlaces.Deserialize(reader); 

    }// Put a break-point here, then mouse-over dezerializedXML and you should have you values 
} 
catch (System.Exception) 
{ 
    throw; 
} 

Bu kod

1

C# nesnelerini aşağıdaki gibi tanımlayabilirsiniz.

[XmlRoot(ElementName="comment")] 
public class Comment { 
    [XmlAttribute(AttributeName="number")] 
    public string Number { get; set; } 
    [XmlAttribute(AttributeName="value")] 
    public string Value { get; set; } 
} 

[XmlRoot(ElementName="title_block")] 
public class Title_block { 
    [XmlElement(ElementName="title")] 
    public string Title { get; set; } 
    [XmlElement(ElementName="company")] 
    public string Company { get; set; } 
    [XmlElement(ElementName="rev")] 
    public string Rev { get; set; } 
    [XmlElement(ElementName="date")] 
    public string Date { get; set; } 
    [XmlElement(ElementName="source")] 
    public string Source { get; set; } 
    [XmlElement(ElementName="comment")] 
    public List<Comment> Comment { get; set; } 
} 

[XmlRoot(ElementName="sheet")] 
public class Sheet { 
    [XmlElement(ElementName="title_block")] 
    public Title_block Title_block { get; set; } 
    [XmlAttribute(AttributeName="number")] 
    public string Number { get; set; } 
    [XmlAttribute(AttributeName="name")] 
    public string Name { get; set; } 
    [XmlAttribute(AttributeName="tstamps")] 
    public string Tstamps { get; set; } 
} 

Şimdi Deserialize verilen Xml bu varlıkları kullanabilirsiniz.

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

StreamReader reader = new StreamReader(filepath); 
var sheet = (Sheet)serializer.Deserialize(reader); 
reader.Close(); 

Kontrol bu Demo code