2016-04-02 3 views
0

Я пишу приложение C# WinForm, которое должно читать файл-сущий XML. Мне нужно разобрать файл XML и создать структуру данных, чтобы отразить содержимое файла XML. У меня есть опыт работы в XML сериализации и, таким образом, я использовал функции .NETXML.Serialization. я застрял в чужой XML структуре, что я не в состоянии соответствовать в классе (корыто атрибуты, элементы и так далее):C# XML Сериализация не вложенных массивов/список

<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> 

«странно» часть этого списка комментариев. Я привык находить такие «повторяющиеся» элементы в результате сериализации списка/массива элементов с помощью директивы XmlArray. В любом случае использование такого подхода приведет к включению в список элементов. В этом случае, как я могу «отразить» эту структуру? Это код, который я должен использовать (без «недостающих» комментарии):

[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; } 
} 

У меня есть другая сторона вопроса. Лучшая иерархия классов для отражения этой структуры: a) Вложение классов аналогично элементам xml b) сохранить все классы на одном уровне (без иерархии)? Есть побочные эффекты, которые следует учитывать?

+0

Мы надеемся, что ваша проблема была решена , Если нет, можете подумать об обновлении вашего вопроса .... http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – Monty

+0

отсутствовал на праздник Я скоро проверю – weirdgyn

ответ

1

Попробуйте это ...

Usings

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

Классы

[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; } 
} 

Код

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; 
} 

Этот код считывает XML из файла (так называемого xml.xml в приложении * папка .exe), а затем dezerialize его к объекту под названием dezerializedXML ....

1

Вы можете определить свои C# объекты следующим образом.

[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; } 
} 

Теперь мы можем использовать эти объекты для Deserialize данного Xml.

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

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

Проверить это Demo code

Смежные вопросы