2017-05-23 1 views
0

私は、次のC#コードでは、次のXMLクラスプロパティをxmlルートの一部としてシリアル化するにはどうすればよいですか?

<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を追加してください。

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

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

属性としてTarget財産を作るために、それはintのような単純なタイプ、DateTimeでなければならない、など

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

それはobject、などのような複合型の場合は、する必要がありますそれを要素のままにします。

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

私はクリップボードにあなたのxmlをコピーしました。

Visual Studioメニューで、[編集]> [形式を選択して貼り付け]> [XMLをクラスとして貼り付け]を選択します。一連のクラスが生成されました。

プロパティTimeStampVersionの前に属性[XmlAttribute]を追加しました。つまり、私は他の何も変えていない。

は、このコードを実行します。最後に

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を得た:

<?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属性になりましたルート要素の

+0

XmlAttributeを追加するとxml出力が変更されません。例えば、タイムスタンプはまだルートに配置されていません... – mko

+0

@mko - それは私のために働く。 –

+0

あなたのコードを貼り付けることができます。なぜなら私は何をしても同じ結果を得るからです。それはXmlFormatterの設定と関係がありますか? – mko

関連する問題