【问题标题】:How to parse an XML string in Swift 6.1 on OSX?如何在 OSX 上的 Swift 6.1 中解析 XML 字符串?
【发布时间】:2014-10-27 04:34:10
【问题描述】:

我是 Swift 新手,我正在尝试创建一个 OSX 终端应用程序来解析 xml 文件。我已经将文件读入字符串,但无法弄清楚如何将其解析为结构,然后我可以从中导航和提取数据。看起来 NSXMLDocument 似乎需要一个 URL,而 NSXMLParser 需要一个委托,但我最初的尝试无法让它们工作。

这是我目前得到的:

import Foundation
import Cocoa

let path = "//Users/<path>/someFile.xml"

var err: NSError?
let content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: &err)

xml文件的结构是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<Data>
  <Documents>
    <List>
      <Document name="name1" type="TYPE1" date="some string">
        <Items>
          <Item name="item1" dataType="DATATYPE1" version="1">
          <Item name="item2" dataType="DATATYPE9" version="4">
        </Items>
      </Document>
      <Document name="name2" type="TYPE4" date="some string">
      ...
    </List>
  </Documents>
</Data>

非常感谢您的帮助。

【问题讨论】:

    标签: xcode macos swift xcode6


    【解决方案1】:

    解析 XML 文档并不是那么简单,并且不能用单行代码来完成。

    要使用NSXMLParser 解析它,您需要一个实现NSXMLParserDelegate 协议的自定义类,如下所示:

    class myXMLParser: NSObject, NSXMLParserDelegate {
        ...
    
        func parseFile(filename: String) {
            let url = NSBundle.mainBundle().URLForResource(filename, withExtension: "xml")
    
            if let parser = NSXMLParser(contentsOfURL: url) {
                parser.delegate = self
                parser.parse()
            }
        }   
    
    
        func parserDidStartDocument(parser: NSXMLParser!) {
            ...
        }
    
        func parserDidEndDocument(parser: NSXMLParser!) {
            ...
        }
    
        func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) {
            ...
        }
    
        func parser(parser: NSXMLParser!, foundCharacters string: String!) {
            ...
        }
    
        func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) {
            ...
        }
    
    }
    

    因此,每当您使用didStartElement 检索新元素时,您必须进一步检查它是什么元素以及您期望的子元素。这一切都取决于您的 XML 文档的结构,因此无法提供一站式解决方案。

    【讨论】:

      【解决方案2】:

      NSXMLDocument 的用法如下所示:

      let fm = NSFileManager.defaultManager()
      var err : NSError?
      let userDirectory = fm.URLForDirectory(.UserDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false, error: &err)
      if err != nil {
        // ...
      }
      
      if let path = userDirectory?.URLByAppendingPathComponent("someFile.xml") {
        NSXMLDocument(contentsOfURL: configURL, options: 0, error: &err)
        if err != nil {
          // ...
        }
      
        if let rootNode = config?.rootElement() {
          // ...
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        相关资源
        最近更新 更多