2011-11-10 2 views
0

deserialize하려는 xml 파일이 있습니다. 직렬화 및 직렬화 해제 용 IXmlSerializable 인터페이스를 구현 중입니다. 직렬화에 문제가 없습니다. 그러나 deserialization과 나는 몇 가지 문제가 있습니다. 1). xml reader의 'ReadToFollowing'을 사용하여 요소를 읽습니다. 이 방법을 사용하면 요소의 순서로 값을 읽어야합니다. 주문에 불일치가 있으면 남아있는 값을 읽을 수 없습니다. 2). 필자의 요구 사항에 따라 xml 비 직렬화에서 이전 버전과의 호환성을 제공해야합니다. 이 때문에 이전 버전 XML 파일 (최신 버전 xml로 모든 요소를 ​​포함하지 않을 수 있음)을로드 할 때 'ReadToFollowing'예외가 발생합니다.XML을 비 직렬화하는 동안 null 인 특성의 기본값 설정

최신 버전의 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

오케이. 나는 연극을 했어이게 내가 가지고 올 한 것입니다 :

Serializeable 클래스 :

[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에게 감사드립니다.하지만 serialize 및 deserializing IXmlSerializable 인터페이스를 사용하고 있습니다. 나는 'ReadXML'메소의 값을 읽어야한다. – Naresh

+0

수정 된 답변을 살펴보십시오. 이 코드는 꽤 좋지는 않지만 작동하는 것처럼 보입니다. – ChrisBD

관련 문제