2017-05-23 3 views
0

나는 다음 XML 다음 C# 코드와클래스 속성을 xml 루트의 일부로 serialize하는 방법은 무엇입니까?

<OTA_HotelResNotifRS xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Connect.Domain.OTA_2014B.Reservations.OTA_HotelResNotifRS"> 
    <HotelReservations> 
     <HotelReservation> 
      <ResGlobalInfo> 
       <HotelReservationIDs> 
        <OTA_HotelResNotifRSHotelReservationsHotelReservationResGlobalInfoHotelReservationID> 
         <ResID_Source>some_source</ResID_Source> 
         <ResID_Type>0</ResID_Type> 
         <ResID_Value>51550</ResID_Value> 
        </OTA_HotelResNotifRSHotelReservationsHotelReservationResGlobalInfoHotelReservationID> 
       </HotelReservationIDs> 
      </ResGlobalInfo> 
     </HotelReservation> 
    </HotelReservations> 
    <Success i:nil="true" /> 
    <Target i:nil="true" /> 
    <TimeStamp>0001-01-01T00:00:00</TimeStamp> 
    <Version>0</Version> 
</OTA_HotelResNotifRS> 

있습니다.

[System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = 

    "http://www.opentravel.org/OTA/2003/05")] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.opentravel.org/OTA/2003/05", IsNullable = false)] 
    public partial class OTA_HotelResNotifRS 

{ 
    /// <remarks/> 
    public OTA_HotelResNotifRSHotelReservations HotelReservations 
    { 
     get; set; 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public System.DateTime TimeStamp 
    { 
     get; set; 
    } 
} 

어떻게 타임 스탬프, 대상 및 버전을 루트 요소에 배치 할 수 있습니까? XmlAttribute 대신 XmlRootAttribute를 추가하려고 시도했지만 오류가 발생합니다.

답변

1

TimeStampVersion 속성을 만들려면 XmlAttribute을 추가하십시오. 이 object 같은 복잡한 유형 인 경우

[XmlAttribute] 
public DateTime TimeStamp { get; set; } 

[XmlAttribute] 
public byte Version { get; set; } 

는 등, 다음해야 할 것 등이 int, DateTime처럼 단순 유형이어야합니다,

[XmlAttribute] 
public int Target { get; set; } 

을 속성으로 Target 속성을 만들려면 그것을 요소로 남겨 두십시오.

[XmlElement] 
public object Target { get; set; } 

나는 클립 보드에 XML을 복사.

Visual Studio 메뉴에서 편집> 선택하여 붙여 넣기> XML을 클래스로 붙여 넣기를 선택하십시오. 일련의 클래스가 생성되었습니다.

TimeStampVersion 속성 전에 [XmlAttribute] 속성을 추가했습니다. 그게 다야, 나는 다른 어떤 변화도하지 않았다.

이 코드를 실행합니다

<?xml version="1.0"?> 
<OTA_HotelResNotifRS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        TimeStamp="0001-01-01T00:00:00" 
        Version="0" 
        xmlns="http://schemas.datacontract.org/2004/07/Connect.Domain.OTA_2014B.Reservations.OTA_HotelResNotifRS"> 
    <HotelReservations> 
    ... 
    </HotelReservations> 
    <Success xsi:nil="true" /> 
    <Target xsi:nil="true" /> 
</OTA_HotelResNotifRS> 

TimeStampVersion가되었다 속성 : 결국

var xs = new XmlSerializer(typeof(OTA_HotelResNotifRS)); 
OTA_HotelResNotifRS ota; 

using (var fs = new FileStream("in.xml", FileMode.Open)) 
    ota = (OTA_HotelResNotifRS)xs.Deserialize(fs); 

using (var fs = new FileStream("out.xml", FileMode.Create)) 
    xs.Serialize(fs, ota); 

을, 나는 (내가 쉽게 읽을의 속성을 포맷 및 내부 노드를 생략) 다음과 같은 XML을 가지고 루트 요소의

+0

XmlAttribute를 추가해도 xml 출력이 변경되지 않습니다. 예를 들어 TimeStamp는 여전히 루트에 위치하지 않습니다 ... – mko

+0

@mko - 그것은 나를 위해 작동합니다. –

+0

코드를 붙여 넣을 수 있습니까? 내가 뭘 할지라도 나는 항상 같은 결과를 얻습니다. XmlFormatter 구성과 관련이 있습니까? – mko