2011-11-10 25 views
0

デシリアライズしようとしているxmlファイルがあります。 シリアル化と逆シリアル化用のIXmlSerializableインターフェイスを実装しています。 シリアル化に問題はありません。 しかし、逆シリアル化ではほとんど問題はありません。 1)。私は要素を読むためにxmlリーダーの 'ReadToFollowing'を使用しています。このアプローチでは、要素の順序で値を読み取る必要があります。注文に不一致がある場合、私は残存値を読み取ることができません。 2)。私の要件として、私はxmlをデシリアライズする際に下位互換性を提供する必要があります。このため、古いバージョンのXMLファイル(すべての要素が最新のバージョンxmlとして含まれていない可能性があります)、「ReadToFollowing」が例外をスローします。デシリアライズ中にヌルの属性のデフォルト値を設定する

最新バージョンのXml

<LEFTSECTION> 
     <DATA /> 
     <FONTNAME>Arial</FONTNAME> 
     <FONTSTYLE>Regular</FONTSTYLE> 
     <FONTSIZE>10</FONTSIZE> 
     <TEXTCOLOR>-16777216</TEXTCOLOR> 
     <STRIKEOUT>0</STRIKEOUT> 
     <UNDERLINE>0</UNDERLINE> 
     <BORDER>0</BORDER> 
     <IMAGE>0</IMAGE> 
     <IMAGENAME /> 
     <ALIGNMENT>4</ALIGNMENT> 
     <SECTIONHEIGHT>0.5454546</SECTIONHEIGHT> 
     <SECTIONWIDTH>0.33</SECTIONWIDTH> 
     </LEFTSECTION> 

旧バージョンのXml

<LEFTSECTION> 
     <DATA>asas#APP_OEM_NAME#</DATA> 
     <FONTNAME>Arial Unicode MS</FONTNAME> 
     <FONTSTYLE>Regular</FONTSTYLE> 
     <FONTSIZE>10</FONTSIZE> 
     <TEXTCOLOR>-16777216</TEXTCOLOR> 
     <STRIKEOUT>0</STRIKEOUT> 
     <UNDERLINE>0</UNDERLINE> 
     <BORDER>0</BORDER> 
     <IMAGE>0</IMAGE> 
     <IMAGENAME> 
     </IMAGENAME> 
     </LEFTSECTION> 

この上で私を助けてください。

+0

うーん、あなたの例のいずれもXMLコードです。 – zmilojko

+0

このXMLデータを作成するか、読み込むだけですか? – ChrisBD

+0

@Chris:ちょうどデータを読む必要があります – Naresh

答えて

1

大丈夫です。私は演劇を持っていたし、これは私が作ってみたものです:

シリアライズクラス:

[Serializable] 
[XmlRoot("LEFTSECTION")] 
public class NewClass 
{ 
    [XmlElement("DATA")] 
    [System.ComponentModel.DefaultValueAttribute("")] 
    public string Data; 

    [XmlElement("FONTNAME")] 
    public string FontName; 

    [XmlElement("FONTSTYLE")] 
    public string FontStyle; 

    [XmlElement("FONTSIZE")] 
    public int FontSize; 

    [XmlElement("TEXTCOLOR")] 
    public int TextColor; 

    [XmlElement("STRIKEOUT")] 
    public int Strikeout; 

    [XmlElement("UNDERLINE")] 
    public int Underline; 

    [XmlElement("BORDER")] 
    public int Border; 

    [XmlElement("IMAGE")] 
    public int Image; 

    [XmlElement("IMAGENAME")] 
    public string ImageName; 

    [System.ComponentModel.DefaultValue(0)] 
    [XmlElement("ALIGNMENT")] 
    public int Alignment; 

    [XmlElement("SECTIONHEIGHT")] 
    public double SectionHeight; 

    [XmlElement("SECTIONWIDTH")] 
    public double SectionWidth; 
} 

そして、私のテストプログラムのコード:input.xmlにの

NewClass test = new NewClass(); 
    XmlSerializer serializer = new XmlSerializer(typeof(NewClass)); 

    FileStream file = new FileStream("input.xml", FileMode.Open); 
    test = (NewClass) serializer.Deserialize(file); 
    file.Close(); 

    file = new FileStream("old.xml", FileMode.Open); 
    test = (NewClass)serializer.Deserialize(file); 
    file.Close(); 

内容:old.xmlの

<?xml version="1.0" encoding="utf-8" ?> 
<LEFTSECTION> 
    <DATA /> 
    <FONTNAME>Arial</FONTNAME> 
    <FONTSTYLE>Regular</FONTSTYLE> 
    <FONTSIZE>10</FONTSIZE> 
    <TEXTCOLOR>-16777216</TEXTCOLOR> 
    <STRIKEOUT>0</STRIKEOUT> 
    <UNDERLINE>0</UNDERLINE> 
    <BORDER>0</BORDER> 
    <IMAGE>0</IMAGE> 
    <IMAGENAME /> 
    <ALIGNMENT>4</ALIGNMENT> 
    <SECTIONHEIGHT>0.5454546</SECTIONHEIGHT> 
    <SECTIONWIDTH>0.33</SECTIONWIDTH> 
</LEFTSECTION> 

内容:

<LEFTSECTION> 
    <DATA>asas#APP_OEM_NAME#</DATA> 
    <FONTNAME>Arial Unicode MS</FONTNAME> 
    <FONTSTYLE>Regular</FONTSTYLE> 
    <FONTSIZE>10</FONTSIZE> 
    <TEXTCOLOR>-16777216</TEXTCOLOR> 
    <STRIKEOUT>0</STRIKEOUT> 
    <UNDERLINE>0</UNDERLINE> 
    <BORDER>0</BORDER> 
    <IMAGE>0</IMAGE> 
    <IMAGENAME> 
    </IMAGENAME> 
</LEFTSECTION> 

これは、クラスを正しく生成します。私のクラスのプロパティDataAlignmentには、存在しない場合にデフォルト値が設定されています。また、ファイル内の名前から名前が変更されます。

これが役立つことを願っています。私が見

編集

ああ、あなたは、あなたのクラスのためのIXmlSerializable方法で立ち往生しています。

それはきれいではありませんが、動作するように表示され、これを試してみてください:

は、ここに私のIXMLSerializableクラスです:

public class XmlSerializableNewClass : IXmlSerializable 
    { 
     public string Data; 
     public string FontName; 
     public string FontStyle; 
     public int FontSize; 
     public int TextColor; 
     public int Strikeout; 
     public int Underline; 
     public int Border; 
     public int Image; 
     public string ImageName; 
     public int Alignment; 
     public double SectionHeight; 
     public double SectionWidth; 
     public string[]elementNames={"DATA", "FONTNAME", "FONTSTYLE","FONTSIZE","TEXTCOLOR","STRIKEOUT", "UNDERLINE", "BORDER", "IMAGE", "IMAGENAME", "ALIGNMENT", "SECTIONHEIGHT", "SECTIONWIDTH"}; 

     #region IXmlSerializable Members 

     public System.Xml.Schema.XmlSchema GetSchema() 
     { 
      return null; 
     } 

     public void ReadXml(System.Xml.XmlReader reader) 
     { 
      //set default values 
      Data=string.Empty; 
      FontName = string.Empty; 
      FontStyle = string.Empty; 
      FontSize = 0; 
      TextColor = 0; 
      Strikeout = 0; 
      Underline = 0; 
      Border = 0; 
      Image = 0; 
      ImageName = string.Empty; 
      Alignment = 0; 
      SectionHeight = 0.0; 
      SectionWidth = 0.0; 

      reader.MoveToContent(); 

      Boolean isEmptyElement= false; 
      isEmptyElement = reader.IsEmptyElement; 
      reader.ReadStartElement(); 
      for (int i=0; i< elementNames.Length; i++) 
      { 
       isEmptyElement = reader.IsEmptyElement; 
       string s = reader.Name; 
       switch (s) 
       { 
        case "DATA": 
         if (!isEmptyElement) 
         { 
          Data = reader.ReadElementString("DATA"); 
         } 
         else 
         { 
          Data = string.Empty; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "FONTNAME": 
         if (!isEmptyElement) 
         { 
          FontName = reader.ReadElementString("FONTNAME"); 
         } 
         else 
         { 
          FontName = string.Empty; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "FONTSTYLE": 
         if (!isEmptyElement) 
         { 
          FontStyle = reader.ReadElementString("FONTSTYLE"); 
         } 
         else 
         { 
          FontStyle = string.Empty; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "FONTSIZE": 
         if (!isEmptyElement) 
         { 
          FontSize = reader.ReadElementContentAsInt(); 
         } 
         else 
         { 
          FontSize = 0; 
          reader.ReadEndElement(); 
         } 
         break; 
        case "TEXTCOLOR": 
         if (!isEmptyElement) 
         { 
          TextColor = reader.ReadElementContentAsInt(); 
         } 
         else 
         { 
          TextColor = 0; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "STRIKEOUT": 
         if (!isEmptyElement) 
         { 
          Strikeout = reader.ReadElementContentAsInt(); 
         } 
         else 
         { 
          Strikeout = 0; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "UNDERLINE": 
         if (!isEmptyElement) 
         { 
          Underline = reader.ReadElementContentAsInt(); 
         } 
         else 
         { 
          Underline = 0; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "BORDER": 
         if (!isEmptyElement) 
         { 
          Border = reader.ReadElementContentAsInt(); 
         } 
         else 
         { 
          Border = 0; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "IMAGE": 
         if (!isEmptyElement) 
         { 
          Image = reader.ReadElementContentAsInt(); 
         } 
         else 
         { 
          Image = 0; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "IMAGENAME": 
         if (!isEmptyElement) 
         { 
          ImageName = reader.ReadElementString("IMAGENAME"); 
         } 
         else 
         { 
          ImageName = string.Empty; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "ALIGNMENT": 
         if (!isEmptyElement) 
         { 
          Alignment = reader.ReadElementContentAsInt(); 
         } 
         else 
         { 
          Alignment = 0; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "SECTIONHEIGHT": 
         if (!isEmptyElement) 
         { 
          SectionHeight = reader.ReadElementContentAsDouble(); 
         } 
         else 
         { 
          SectionHeight = 0; 
          reader.ReadStartElement(); 
         } 
         break; 
        case "SECTIONWIDTH": 
         if (!isEmptyElement) 
         { 
          SectionWidth = reader.ReadElementContentAsDouble(); 
         } 
         else 
         { 
          SectionWidth = 0; 
          reader.ReadEndElement(); 
         } 
         break; 
       } 
      } 
      reader.ReadEndElement(); 
     } 

     public void WriteXml(System.Xml.XmlWriter writer) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 

私は空の要素を処理してビット船外に行ってきました。

ここでは、呼び出し元のコードがあります、他のすべてが同じである:

XmlSerializableNewClass test2 = new XmlSerializableNewClass(); 

    System.Xml.XmlReaderSettings settings = new System.Xml.XmlReaderSettings(); 
    settings.ConformanceLevel = System.Xml.ConformanceLevel.Fragment; 
    settings.IgnoreWhitespace = true; 
    settings.IgnoreComments = true; 
    System.Xml.XmlReader reader = System.Xml.XmlReader.Create("input.xml", settings); 

    test2.ReadXml(reader); 

    reader = System.Xml.XmlReader.Create("old.xml", settings); 
    test2.ReadXml(reader); 
+0

応答Chrisのおかげで。しかし、私はシリアル化とデシリアライズにIXmlSerializableインターフェイスを使用しています。私は 'ReadXML'のメソッドの値を読みなければなりません。 – Naresh

+0

編集した解答を見てください。コードはきれいではありませんが、動作するようです。 – ChrisBD

関連する問題