Нативная разработка мобильных приложений



Download 3,69 Mb.
Pdf ko'rish
bet136/228
Sana21.07.2022
Hajmi3,69 Mb.
#834838
1   ...   132   133   134   135   136   137   138   139   ...   228
Bog'liq
Нативная разработка мобильных приложений

XML
XML – более старый формат, чем JSON. Существует множество разных стандар
-
тов XML, в том числе некоторые очень специфические, такие как простой про
-


202

Сериализация и транспорты
токол доступа к объектам (Simple Object Access Protocol, SOAP), но мы, чтобы не 
усложнять, будем использовать для демонстрации слегка измененную версию 
формата JSON, примененного выше. Начнем с такого фрагмента XML:


Mike

Этот фрагмент описывает автора с именем Mike, который оказался челове
-
ком (
type="human"
) и, по случайному совпадению, автором этой книги.
Если вы ожидаете такой же простоты, какую предлагает протокол 
Codable

реа лизованный в 
JSONEncoder
и 
JSONDecoder
, то у меня есть плохие новости: 
XMLPar ser
в iOS гораздо более многословен.
Возьмем этот фрагмент XML и создадим из него объект, выполнив парсинг:
class SomeObject: NSObject {
func parseSomeXML() {
let xml = "
Mike"
let rawData = xml.data(using: .utf8)!
let parser = XMLParser(data: rawData)
parser.delegate = self;
parser.parse()
}
}
У нас есть класс 
SomeObject
, наследующий 
NSObj
ect
, который имеет созданный 
нами метод 
parseSomeXml
. Этот метод определяет строковую переменную с име
-
нем 
xml
, содержащую наш фрагмент XML. В следующей строке мы преобразуем 
его в объект 
Data
в кодировке UTF-8. Затем создаем экземпляр 
XMLParser
с объ
-
ектом 
rawData
. Назначаем себя в качестве делегата для обработки событий пар
-
синга. И наконец, вызываем 
parse()
, запуская парсинг.
Если попытаться запустить этот код прямо сейчас, он завершится с ошибкой, 
потому что в настоящее время 
SomeObject
не реализует протокол 
XMLParserDel­
egate
, который должен быть реализован для правильной обработки событий 
парсинга. Поэтому давайте подробно рассмотрим каждый метод протокола, 
чтобы понять суть происходящего.
Парсинг XML происходит синхронно. Документ сканируется, и из него из
-
влекаются элементы один за другим. В нашем делегате мы будем использовать
четыре метода:
1) 
parser(_:didStartElement:namespaceURI:qualifiedName:attributes:)
2) 
parser(_:foundCharacters:)
3) 
parser(_:didEndElement:namespaceURI:qualifiedName:)
4) 
parserDidEndDocument(_:)
Вот первый метод из этого списка:
func parser(_ parser: XMLParser, didStartElement elementName: String, 
namespaceURI: String?, qualifiedName qName: String?, 
attributes attributeDict: [String : String] = [:]) {


iOS 

203
if elementName == "author" {
author = Author()
if let type = attributeDict["type"] {
author?.type = type
}
}
}
Этот метод вызывается каждый раз, парсер обнаруживает в документе но
-
вый элемент XML. В нашем предыдущем примере XML единственными до
-
пустимыми элементами являются 
author
и 
name
. После обнаружения нового 
элемента 
author
мы создаем новый экземпляр 
Author
в свойстве 
author
класса 
SomeObject
. Оно играет роль временного хранилища для экземпляра 
Author
, ко
-
торый еще предстоит заполнить данными, которые найдем, продолжая пар
-
синг этого элемента.
Первый фрагмент данных – атрибут 
type
. Если вы помните, наши авторы 
характеризуются типом, и в данном конкретном XML-элементе это тип 
hu­
man
. Мы присваиваем это значение свойству 
type
во временном экземпляре 
Author
.
Продолжив парсинг документа, мы обнаружим элемент 
name
. Этот элемент 
не требует никакой специальной обработки, мы должны лишь извлечь данные, 
находящиеся между тегами 

и 

. Эту операцию реализует следую
-
щий метод в нашем списке: 
parser(_:foundCharacters:)
:
func parser(_ parser: XMLParser, foundCharacters string: String) {
characters += string
}
В теле этого метода мы сохраняем все найденные символы в свойстве 
char­
acters
нашего экземпляра 
SomeObject
. Это свойство действует как временный 
буфер для хранения символов, обнаруживаемых на каждом следующем шаге, 
пока парсер не встретит закрывающий тег:
func parser(_ parser: XMLParser, didEndElement elementName: String, 
namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "name" {
author?.name = characters
}
characters = ""
}
Данный метод делегата вызывается парсером всякий раз, когда обнаружи
-
вается закрывающий тег. В нашем случае это 

. В подобном случае мы 
переписываем содержимое временного буфера 
characters
в свойство 
name
на
-
шего объекта 
author
.
В заключение, добравшись до конца документа, мы берем получившийся 
объект и выводим его вызовами 
print()
:
func parserDidEndDocument(_ parser: XMLParser) {
print(author.name)
print(author.type)
}


204

Сериализация и транспорты
Если бы в нашем XML­документе было больше элементов, мы продолжили бы 
создавать новые экземпляры авторов и сохраняли бы их перед началом парсинга 
нового элемента и создания временного объекта.
Вот полный код реализации парсинга, описанной выше:
struct Author {
var name: String?
var type: String?
}
class SomeObject: NSObject {
var author: Author?
var characters: String = ""
func parseSomeXML() {
let xml = "
Mike"
let rawData = xml.data(using: .utf8)!
let parser = XMLParser(data: rawData)
parser.delegate = self;
parser.parse()
}
}
extension SomeObject: XMLParserDelegate {
func parser(_ parser: XMLParser, didStartElement elementName: String,
namespaceURI: String?, qualifiedName qName: String?, 
attributes attributeDict: [String : String] = [:]) {
if elementName == "author" {
author = Author()
if let type = attributeDict["type"] {
author?.type = type
}
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
characters += string
}
func parser(_ parser: XMLParser, didEndElement elementName: String,
namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "name" {
author?.name = characters
}
characters = ""
}
func parserDidEndDocument(_ parser: XMLParser) {
print(author?.name)
print(author?.type)
}
}


iOS 


Download 3,69 Mb.

Do'stlaringiz bilan baham:
1   ...   132   133   134   135   136   137   138   139   ...   228




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish