【问题标题】:How do I pass a url to NSBundle for xml parsing with AEXML?如何将 url 传递给 NSBundle 以使用 AEXML 进行 xml 解析?
【发布时间】:2015-04-23 12:11:37
【问题描述】:

我正在使用AEXML 并希望将 XML 从 REST 服务传递到 AEXML 解析器。但是,在提供的示例代码中,作者将 local xml 文件传递​​到他的解析器中。根据提供的示例,我似乎无法弄清楚如何传递通过 URL 接收到的 xml 数据。

我尝试捕获 url 并在将其传递给捆绑程序之前使用 NSXMLParser 对其进行解析,但这没有用。我还尝试从 URL 流创建一个 NSData 对象。所以它把我引向了这个问题。

如何将 url 传递给 NSBundle 进行 xml 解析?

相关代码:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // example from README.md
        if let xmlPath = NSBundle.mainBundle().pathForResource("example", ofType: "xml") {
            if let data = NSData(contentsOfFile: xmlPath) {

                // works only if data is successfully parsed
                // otherwise prints information about error with parsing
                var error: NSError?
                if let xmlDoc = AEXMLDocument(xmlData: data, error: &error) {

                    // prints the same XML structure as original
                    println(xmlDoc.xmlString)

                    // prints cats, dogs
                    for child in xmlDoc.root.children {
                        println(child.name)
                    }

                    // prints Optional("Tinna") (first element)
                    println(xmlDoc.root["cats"]["cat"].value)

                    // prints Tinna (first element)
                    println(xmlDoc.root["cats"]["cat"].stringValue)

如果需要查看更多代码,可以在GitHub here查看。

【问题讨论】:

  • 注意:我昨晚发布了这个,并认为我的问题是由于 Xcode 造成的,但我删除了我原来的帖子。

标签: xml swift nsdata nsxmlparser nsbundle


【解决方案1】:

你不能将包含远程数据的 URL 传递给 AEXML,因为它不做网络,只做 XML 解析。

您应该首先从您的 URL 创建 NSData,然后从该数据创建 AEXMLDocument。

如果您查看 AEXMLExample 项目,您会找到执行此操作的确切示例,如果您在模拟器中运行它,您也可以使用任何 URL 进行尝试:

@IBAction func tryRemoteXML(sender: UIButton) {
    if let url = NSURL(string: textField.text) {
        if let data = NSData(contentsOfURL: url) {
            var error: NSError?
            if let doc = AEXMLDocument(xmlData: data, error: &error) {
                var parsedText = String()
                // parse unknown structure
                for child in doc.root.children {
                    parsedText += child.xmlString + "\n"
                }
                textView.text = parsedText
            } else {
                let err = "description: \(error?.localizedDescription)\ninfo: \(error?.userInfo)"
                textView.text = err
            }
        }
    }
    textField.resignFirstResponder()
}

【讨论】:

  • 好吧...我不觉得很傻。昨晚我玩了几个 XML 解析器,由于某种原因,当我打开你的项目时,我直接去了视图控制器。好的,谢谢 tadija。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多