[Swift通天遁地]7、數據與安全-(1)XML文檔的建立和解析

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-bfduphmd-ma.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

目錄:[Swift]通天遁地Swiftios

本文將演示可擴展標記語言文檔的解析和編寫。git

首先確保在項目中已經安裝了所需的第三方庫。github

點擊【Podfile】,查看安裝配置文件。swift

1 platform :ios, '12.0'
2 use_frameworks!
3 
4 target 'DemoApp' do
5     source 'https://github.com/CocoaPods/Specs.git'
6     pod 'AEXML'
7 end

根據配置文件中的相關配置,安裝第三方庫。數組

而後點擊打開【DemoApp.xcworkspace】項目文件。安全

在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】微信

  1 import UIKit
  2 //引入已經安裝的第三方類庫
  3 import AEXML
  4 
  5 class ViewController: UIViewController {
  6 
  7     override func viewDidLoad() {
  8         super.viewDidLoad()
  9         // Do any additional setup after loading the view, typically from a nib.
 10         //讀取和解析文檔
 11         readXML()
 12         //編寫XML文檔
 13         writeXML()
 14     }
 15     
 16     //添加一個方法,用來讀取和解析文檔
 17     func readXML()
 18     {
 19         //讀取項目中的待解析的文檔
 20         guard let xmlPath = Bundle.main.path(forResource: "XMLExample", ofType: "xml"),
 21             let data = try? Data(contentsOf: URL(fileURLWithPath: xmlPath)) else {
 22             return
 23         }
 24         
 25         //添加一個異常捕捉語句,用來實現對文檔的解析
 26         do
 27         {
 28             //初始化一個文檔對象,使用該文檔對象,存儲和加載數據。
 29             let xmlDoc = try AEXMLDocument(xml: data, options: AEXMLOptions())
 30             print(xmlDoc.xml)
 31             
 32             print("-----------------------------")
 33             //經過一個循環語句,遍歷根節點中的全部子節點。            
 34             for child in xmlDoc.root.children
 35             {
 36                 //並在控制檯輸出子節點的名稱
 37                 print("child.name:\(child.name)")
 38             }
 39             
 40             print("-----------------------------")
 41             //從根節點中得到cats子節點,
 42             //而後再得到該節點中的cat子節點,
 43             //接着輸出該節點的值。
 44             print(xmlDoc.root["cats"]["cat"].value as Any)
 45             //得到並初始節點的詳細內容
 46             print(xmlDoc.root["cats"]["cat"].string)
 47             //從根節點中得到dogs子節點,
 48             //而後再得到該節點中的dog子節點,
 49             //接着輸出該節點的值。
 50             print(xmlDoc.root["dogs"]["dog"].last?.value as Any)
 51             //得到該節點中的第三個節點,並輸出該節點的詳細內容。
 52             print(xmlDoc.root["dogs"].children[2].string)
 53             
 54             print("--------------all---------------")
 55             //得到cats節點下的全部指定的子節點,並存儲在一個數組中。
 56             if let cats = xmlDoc.root["cats"]["cat"].all
 57             {
 58                 //對由子節點組成的數組進行遍歷
 59                 for cat in cats
 60                 {
 61                     //而後輸出遍歷到的元素的值
 62                     if let name = cat.value
 63                     {
 64                         print(name)
 65                     }
 66                 }
 67             }
 68             
 69             //過濾cats節點下的全部指定的子節點            
 70             print("---------------withValue--------------")
 71             //並得到擁有特定值的cat節點
 72             if let cats = xmlDoc.root["cats"]["cat"].all(withValue: "Tinna")
 73             {
 74                 //對由子節點組成的數組進行遍歷
 75                 for cat in cats
 76                 {
 77                     //並輸出節點的詳細內容
 78                     print(cat.string)
 79                 }
 80             }
 81             
 82             print("-------------withAttributes----------------")
 83             //過濾cats節點下的全部指定的子節點,並得到擁有特定屬性的子節點。
 84             if let cats = xmlDoc.root["cats"]["cat"].all(withAttributes: ["breed" : "Domestic", "color" : "yellow"])
 85             {
 86                 //對由子節點組成的數組進行遍歷,
 87                 for cat in cats
 88                 {
 89                     //並輸出節點的詳細內容
 90                     print(cat.string)
 91                 }
 92             }
 93             
 94             print("--------------attributes---------------")
 95             //對dogs節點下的全部子節點,進行遍歷操做。
 96             for dog in xmlDoc.root["dogs"]["dog"].all!
 97             {
 98                 //得到該節點的顏色屬性
 99                 if let color = dog.attributes["color"]
100                 {
101                     //若是顏色屬性的值爲白色
102                     if color == "white"
103                     {
104                         //則輸出當前顏色的詳細內容
105                         print(dog.string)
106                     }
107                 }
108             }
109             
110             print("-----------------------------")
111             //經過count屬性,能夠得到同名節點的數量。
112             print(xmlDoc.root["cats"]["cat"].count)
113             //並輸出指定節點的品牌屬性
114             print(xmlDoc.root["cats"]["cat"].attributes["breed"]!)
115             //得到並輸出指定節點的標籤內容,
116             //該內容中的回車符和將被去除
117             print(xmlDoc.root["cats"]["cat"].xmlCompact)
118         }
119         catch
120         {
121             //輸出錯誤信息
122             print("\(error)")
123         }
124     }
125     
126     //添加一個方法,用來編寫XML文檔
127     func writeXML()
128     {
129         //初始化一個文檔對象
130         let soapRequest = AEXMLDocument()
131         //建立一個字典對象,做爲文檔的命名空間
132         let attributes = ["xmlns:xsi" : "http://www.w3.org/2001/XMLSchema-instance",
133                           "xmlns:xsd" : "http://www.w3.org/2001/XMLSchema"]
134         
135         //往文檔中添加一個指定名稱和屬性的節點
136         let envelope = soapRequest.addChild(name: "soap:Envelope", attributes: attributes)
137         //繼續往該節點添加一個名爲"Employees"的節點
138         let employees = envelope.addChild(name: "Employees")
139         //往"Employees"子節點添加一個名爲"Managers"的節點
140         let managers = employees.addChild(name: "Managers")
141         //往"Managers"節點添加一個指定名稱和年齡等屬性的子節點
142         managers.addChild(name: "Manager", attributes:["Name":"Jerry", "age":"40"])
143         //往"Managers"節點添加一個指定名稱和年齡等屬性的子節點
144         managers.addChild(name: "Manager", attributes:["Name":"Peter", "age":"44"])
145         
146         //往"Employees"子節點添加一個名爲"Engineers"的節點
147         let engineers = employees.addChild(name: "Engineers")
148         //往"Engineers"節點添加一個指定名稱和年齡等屬性的子節點
149         engineers.addChild(name: "Engineer", attributes:["Name":"Bill", "age":"29"])
150         engineers.addChild(name: "Engineer", attributes:["Name":"Somus", "age":"31"])
151         
152         print(soapRequest.xml)
153     }
154     
155     override func didReceiveMemoryWarning() {
156         super.didReceiveMemoryWarning()
157         // Dispose of any resources that can be recreated.
158     }
159 }
相關文章
相關標籤/搜索