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を非直列化するための最良の方法は何ですか?
ヘイデイヴィッド、実際に問題を解決しました。ご協力いただきありがとうございます! – Mantracker