【问题标题】:Swift 3 XCode 8.3.3 XML ParsingSwift 3 XCode 8.3.3 XML 解析
【发布时间】:2017-11-15 07:16:22
【问题描述】:

我正在尝试将一些 XML 数据解析为 tableView,但我一直想出我的字符串为空,因此不允许我填充 tableView。我已经在网上进行了全面检查,试图找到如何实现这一目标的好例子,但由于一直在迅速变化,一切似乎都已经过时了。

<?xml version="1.0" encoding="UTF-8"?>
<client region = "Midwest">
<person
name = "Pete Seeger"
profession = "Musician"
dob = "May 3, 1919">
<child
name = "Daniel">
</child>
<child
name = "Mika">
</child>
<child
name = "Tinya">
</child>
</person>
</client>

接下来是我的 Client.swift 文件

class Client{
var clientName: String = String()
var clientProfession: String = String()
var clientDob: String = String()}

在我的 ViewController 中我已经声明了这些变量

var client: [Client] = []
var eName: String = String() //element Name
var cName: String = String()
var cProfession: String = String()
var cDOB: String = String()

前面是我的didStart/didEnd/和foundCharacters

 func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
    //this finds the starting tag of <person>
    eName = (elementName as NSString) as String
    if eName == "person"{
        print("we found start tag of person")
        cName = String()
        cProfession = String()
        cDOB = String()
}

 func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?)
{
    //this looks for the end tag </person>
    if eName == "person"{
        print("we found End tag of person")
        let client = Client() //letting the client = to w.e
        print(client, "printing client in the didEndElement")
        client.clientName = cName
        print(cName, "This is the cName though nothing will show I bet...")
        client.clientProfession = cProfession
        client.clientDob = cDOB
    }
func parser(_ parser: XMLParser, foundCharacters string: String)
{

let foundChar = string.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)

    print(foundChar, "This is foundChar for foundCharacters")
    if(foundChar.isEmpty){
        print("its empty")
        }
        else{
            if eName == "name"{
                cName += foundChar
                cProfession += foundChar
                cDOB += foundChar
        }

    }

我正在寻找人的开始标签和结束标签,但是一旦它到达 foundCharacters 似乎它返回的是空的。我在这里忽略了什么吗?

【问题讨论】:

  • 你可能想试试这个:github.com/tadija/AEXML
  • 检查这可能对您的场景有所帮助:stackoverflow.com/questions/29937456/…
  • 所有这些在线示例都使用 NSXML 函数和调用,我知道有些你应该能够删除 NS 并且它会正常运行,但我仍然留下与如何相同的示例我的设置没有任何进展。

标签: json swift xml tableview


【解决方案1】:

您在错误的位置查找数据。

parser(_:foundCharacters:) 函数被调用以处理打开和关闭标签之间的文本。

对于以下示例 XML:

<name>Pete Seeger</name>

parser(_:foundCharacters:) 函数将使用foundCharacters = "Pete Seeger" 调用

您要查找的数据在元素的属性中。只需检查parser(_:didStartElement:namespaceURI:qualifiedName:attributes:) 函数中的attributeDict 参数即可。

func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
    //this finds the starting tag of <person>
    eName = (elementName as NSString) as String
    if eName == "person"{
        print("we found start tag of person")
        cName = attributeDict["name"] ?? ""
        cProfession = attributeDict["profession"] ?? ""
        cDOB = attributeDict["dob"] ?? ""
    }
}

另外,如果您对将 XML 映射到 swift 对象感兴趣,请考虑XMLMapper。 (使用与ObjectMapper 相同的技术)

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2015-03-20
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多