В настоящее время протокол Apple Codable не позволяет декодировать XML.Хотя Plist - это XML, XML не обязательно является Plist, если он не соответствует определенному формату.
Хотя существует множество сторонних библиотек, я бы посоветовал вам взглянуть на XMLParsing library .Эта библиотека содержит XMLDecoder и XMLEncoder , который использует собственный протокол Apple Codable , и основан на Apple JSONEncoder / JSONDecoder с изменениями, соответствующими стандарту XML.
Ссылка: https://github.com/ShawnMoore/XMLParsing
XML W3School для анализа:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
Swift Struct, соответствующий кодируемым:
struct Note: Codable {
var to: String
var from: String
var heading: String
var body: String
}
XMLDecoder:
let data = Data(forResource: "note", withExtension: "xml") else { return nil }
let decoder = XMLDecoder()
do {
let note = try decoder.decode(Note.self, from: data)
} catch {
print(error)
}
XMLEncoder:
let encoder = XMLEncoder()
do {
let data = try encoder.encode(self, withRootKey: "note")
print(String(data: data, encoding: .utf8))
} catch {
print(error)
}
Существует ряд преимуществза использование протокола Apple Codable поверх протокола стороннего производителя.Например, если Apple решит начать поддерживать XML, вам не придется проводить рефакторинг.
Полный список примеров этой библиотеки см. В папке «Образец XML» в хранилище.
Существует несколько различий между декодерами и кодировщиками Apple, соответствующими стандарту XML.Они следующие:
Различия между XMLDecoder и JSONDecoder
XMLDecoder.DateDecodingStrategy
имеют дополнительный регистр под названием keyFormatted
.В этом случае происходит закрытие, которое дает вам CodingKey, и вы должны предоставить правильный DateFormatter для предоставленного ключа.Это просто вспомогательный случай для DateDecodingStrategy JSONDecoder. XMLDecoder.DataDecodingStrategy
имеет дополнительный случай, озаглавленный keyFormatted
.В этом случае происходит закрытие, которое дает вам CodingKey, и вы должны предоставить правильные данные или ноль для предоставленного ключа.Это просто удобный случай для DataDecodingStrategy JSONDecoder. - Если объект, соответствующий протоколу Codable, имеет массив, а анализируемый XML не содержит элемент массива, XMLDecoder будетприсвоить атрибуту пустой массив.Это связано с тем, что в стандарте XML говорится, что если XML не содержит атрибута, это может означать, что таких элементов нет.
Различия между XMLEncoder и JSONEncoder
Содержит параметр с именем StringEncodingStrategy
, у этого перечисления есть два параметра, deferredToString
и cdata
.Параметр deferredToString является значением по умолчанию и будет кодировать строки как простые строки.Если выбран cdata , все строки будут закодированы как CData.
Функция encode
принимает два дополнительных параметра, чем JSONEncoder.Первый дополнительный параметр в функции - это строка RootKey , в которой весь XML-код будет заключен в элемент с именем этого ключа.Этот параметр является обязательным.Второй параметр - это XMLHeader, который является необязательным параметром, который может принимать версию, стратегию кодирования и автономный статус, если вы хотите включить эту информацию в кодированный xml.