使用Swift 3的漂亮打印XML

Mar*_*lle 3 xml pretty-print swift swift3

使用Swift 2.2,我曾经像这样美化XML:

let detxTag = NSXMLElement(name: "detx")
let xml = NSXMLDocument(rootElement: detxTag)

// ...

let data = xml.XMLDataWithOptions(NSXMLNodePrettyPrint | NSXMLNodeCompactEmptyElement)
Run Code Online (Sandbox Code Playgroud)

不幸的是,使用此代码不再使用Swift 3(由Xcode 8自动转换):

let detxTag = XMLElement(name: "detx")
let xml = XMLDocument(rootElement: detxTag)

// ...

let data = xml.xmlData(withOptions: NSXMLNodePrettyPrint)
Run Code Online (Sandbox Code Playgroud)

它会产生以下错误:

Use of unresolved identifier 'NSXMLNodePrettyPrint'
Run Code Online (Sandbox Code Playgroud)

似乎进/出选项已经改变但是如何使用它并不是很清楚:https://developer.apple.com/reference/foundation/xmldocument/input_and_output_options

任何的想法?

Mar*_*n R 10

xmlData(withOptions:)接受XMLNode.Options,但必须转换为Int:

let data = xml.xmlData(withOptions: Int(XMLNode.Options.nodePrettyPrint.rawValue))
Run Code Online (Sandbox Code Playgroud)

或多种选择:

let options: XMLNode.Options = [.nodePrettyPrint, .nodeCompactEmptyElement]
let data = xml.xmlData(withOptions: Int(options.rawValue))
Run Code Online (Sandbox Code Playgroud)

Swift 4开始, xmlData(withOptions:)采用一个XMLNode.Options 参数,所以这简化为

let data = xml.xmlData(options: .nodePrettyPrint)
Run Code Online (Sandbox Code Playgroud)

对于单一选项,或

let data = xml.xmlData(options: [.nodePrettyPrint, .nodeCompactEmptyElement])
Run Code Online (Sandbox Code Playgroud)

多种选择.

  • 填充雷达很无聊,因为它完全不透明. (2认同)