【问题标题】:Pretty print XML with Swift 3使用 Swift 3 漂亮地打印 XML
【发布时间】:2016-09-13 11:03:59
【问题描述】:

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

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

// ...

let data = xml.XMLDataWithOptions(NSXMLNodePrettyPrint | NSXMLNodeCompactEmptyElement)

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

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

// ...

let data = xml.xmlData(withOptions: NSXMLNodePrettyPrint)

它会产生以下错误:

Use of unresolved identifier 'NSXMLNodePrettyPrint'

in/out 选项好像变了但是不太清楚怎么用:https://developer.apple.com/reference/foundation/xmldocument/input_and_output_options

有什么想法吗?

【问题讨论】:

    标签: xml swift swift3 pretty-print


    【解决方案1】:

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

    let data = xml.xmlData(withOptions: Int(XMLNode.Options.nodePrettyPrint.rawValue))
    

    或多个选项:

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

    Swift 4 开始,xmlData(withOptions:) 采用 XMLNode.Options 论点,所以这简化为

    let data = xml.xmlData(options: .nodePrettyPrint)
    

    对于单个选项,或

    let data = xml.xmlData(options: [.nodePrettyPrint, .nodeCompactEmptyElement])
    

    多个选项。

    【讨论】:

    • 这有点奇怪:我认为 swift 3 带来了更多的一致性......
    • @MartinDelille:当然,如果Int(options.rawValue) 转换不是必需的,那就太好了,但我无法更改它。如果对您很重要,您可以向 Apple 提交错误报告。
    • 不,没那么重要:我不怪你的回答,别担心;-)
    • 加注雷达很无聊,因为它完全不透明。
    • 谢谢,那真的很臭。 Swift 的 API 转换还有一些工作要做;-)
    【解决方案2】:

    斯威夫特 4.2 ?:

    if let xml = try? XMLElement.init(xmlString:"<A><b>test</b><c>test</c></A>") {
       let data = xmlDoc.xmlData(options:.nodePrettyPrint)
       let str = String(data: data, encoding: .utf8)!
       print(str)
    }
    
    //Output:
    <A>
       <b>test</b>
       <c>test</c>
    </A>
    

    【讨论】:

      【解决方案3】:

      不应该是这样的:

      func prettyFormat(xmlString:String) -> String? {
        do {
          let xml = try XMLDocument.init(xmlString: xmlString)
          let data = xml.xmlData(options: .nodePrettyPrint)
          let str:String? = String(data: data, encoding: .utf8)
          return str
        }
        catch {
          print (error.localizedDescription)
        }
        return nil
      }
      

      用法:

      var str = "Hello, XML Pretty Format playground"
      let testStr:String? = "<A><b>test</b>  <c>test</c><d>\(str)</d></A>  "
      
      
      let aStr = prettyFormat(xmlString: "<A><b>test</b>  <c>test</c><d>\(str)</d></A>  ")
      print (aStr ?? "?")
      
      let bStr = prettyFormat(xmlString:testStr!)
      print (bStr ?? "?")
      

      XMLElement.init 不工作... 请改进..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-21
        • 1970-01-01
        • 2017-12-19
        • 2010-09-13
        • 1970-01-01
        相关资源
        最近更新 更多