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

....(アプリケーションでxml.xml * .exeのフォルダと呼ばれる)ファイル、その後dezerializedXMLと呼ばれるオブジェクトにdezerializeからあなたのxmlを読み込み。そうでない場合は、おそらくあなたの質問を更新すると思います.... 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; 
} 

このコードは、私たちは、あなたの問題が解決されていることを願っています

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

ここで、これらのエンティティはXmlに指定できます。

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

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

チェックこのDemo code

関連する問題