让使用 XPath 导航 XML 变得更简单。
仅支持 Swift Package。将此仓库 URL 添加到你的 package 依赖项中。 Xcode 11 默认支持。
let xmlDoc = try! Doc(fileURL: assetURL(forName: "xml.xml"), kind: .xml)
// or if you want to use on HTML
let htmlDoc = try! Doc(fileURL: assetURL(forName: "html.html"), kind: .html)
// you can also init from data or string
let dataDoc = try! Doc(data: #<data>, kind: .xml)
let stringDoc = try! Doc(string: "<html><body>Hello World</body></html>", kind: .html)
// func select(xpath: String) -> [Node]
let nodes = htmlDoc.root.select(xpath: "//p") // Select all `p` on root node:
// func first(xpath: String) -> Node?
let p = htmlDoc.root.first(xpath: "//p") // Select first `p` on root node:
let span = p.first("./span") // Select first child span on `p`
func eval(expr: String) -> Node.EvalResult?
// count how many p tags
let count = htmlDoc.root.eval(expr: "count(//p)")
var tag: String?
var content: String?
var rawContent: String?
var innerRawContent: String?
var attributes: AnySequence<Node.Attribute>?
func value(forAttribute name: String) -> String?
var parent: Node?
var childNodes: AnySequence<Node>?
var firstNode: Node?
func childNode(at index: Int) -> Node?
var prev: Node?
var next: Node?
默认情况下,XPaver
会在内部解决命名空间问题,如果文档只有一个默认命名空间,则无需关心命名空间。
但是,如果您遇到包含多个命名空间的 XML,例如:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<person xmlns="http://www.your.example.com/xml/person">
<name>Rob</name>
<age>37</age>
<homecity xmlns="http://www.my.example.com/xml/cities">
<name>London</name>
<lat>123.000</lat>
<long>0.00</long>
</homecity>
</person>
您需要注册命名空间并在 XPath 中直接写入命名空间。
let mnsXmlDoc = try! Doc(fileURL: url, kind: .xml)
mnsXmlDoc.register(namespaceURI: "http://www.your.example.com/xml/person", forPrefix: "p")
mnsXmlDoc.register(namespaceURI: "http://www.my.example.com/xml/cities", forPrefix: "c")
let cityName = mnsXmlDoc.root.first(xpath: "/p:person/c:homecity/c:name")
MIT.