2017-08-07 3 views
0

SWXMLHashの例を使用してXMLファイルを逆シリアル化しました。私が作成し、SWXMLHashを使用してxmlをデシリアライズするときに不足しているプロパティを処理する

<shippingInfo> 
      <shippingServiceCost currencyId="USD">0.0</shippingServiceCost> 
      <shippingType>Free</shippingType> 
      <shipToLocations>US</shipToLocations> 
      <expeditedShipping>true</expeditedShipping> 
      <oneDayShippingAvailable>false</oneDayShippingAvailable> 
      <handlingTime>1</handlingTime> 
</shippingInfo> 

このXMLをデシリアライズするには:

例えば、XML入力はこれですと仮定します。それは非常によく働いて、私はXML入力が不完全な場合のケースを処理する方法がわからないです

<shippingInfo> 
      <shippingServiceCost currencyId="USD">0.0</shippingServiceCost> 
      <shippingType>Free</shippingType> 
      <shipToLocations>Worldwide</shipToLocations> 
      <expeditedShipping>false</expeditedShipping> 
      <oneDayShippingAvailable>false</oneDayShippingAvailable> 
</shippingInfo> 
:shippingInfo XMLまでXMLIndexerDeserializable

import SWXMLHash 

struct ShippingInfo: XMLIndexerDeserializable 
{ 
    let currencyId: String 
    let shippingServiceCost: Double 
    let shippingType: String 
    let shipToLocations: String 
    let expeditedShipping: Bool 
    let oneDayShippingAvailable: Bool 
    let handlingTime: Int 

    static func deserialize(_ node: XMLIndexer) throws -> ShippingInfo 
    { 
     return try ShippingInfo(
      currencyId: node["shippingServiceCost"].value(ofAttribute: "currencyId"), 
      shippingServiceCost: node["shippingServiceCost"].value(), 
      shippingType: node["shippingType"].value(), 
      shipToLocations: node["shipToLocations"].value(), 
      expeditedShipping: node["expeditedShipping"].value(), 
      oneDayShippingAvailable: node["oneDayShippingAvailable"].value(), 
      handlingTime: node["handlingTime"].value() 
     ) 
    } 
} 

作品上記のコードであり、以下の構造体は、そうのような要素を、ミス

上記の2番目のXMLには、プロパティ"handlingTime"がありません。上記の逆シリアル化のコードを実行ノード[「handlingTime」]で例外をスローします。値()

この問題を解決するための一つのアプローチは、我々はXMLIndexerのキーにアクセスするたびに例外をキャッチし、渡ししようとすることです例外がスローされた場合、キーが存在しないことを意味するデフォルト値をプロパティに設定します。私はこれが最善のアプローチだとは思わない。

XMLにプロパティが不足しているときに、XMLを非直列化するための最良の方法は何ですか?

答えて

1

変更IntからInt?にごhandlingTimeプロパティの宣言、そのよう:

let handlingTime: Int? 

それは、逆シリアル化が存在しない値をサポートできるように、NULL可能である必要があります。

希望すると便利です。

+0

ヘイデイヴィッド、実際に問題を解決しました。ご協力いただきありがとうございます! – Mantracker

関連する問題