我有一个使用Swift的XMLParser,效果很好。但是,有时节点会出现与我想要的实际节点相同的名称。因此,当这些额外的节点出现时,就会混淆一切。以下是良好方案的示例。这有点简化以帮助解释。
<master>
<inputs>
<input>
<input>
</inputs>
<overlays>
<overlay number="1">4</overlay>
<overlay number="2">7</overlay>
</overlays>
</master>
但是有时会发生这种情况并且会弄乱我的代码。
<master>
<inputs>
<input>
<overlay index="0"/>
</input>
</inputs>
<overlays>
<overlay number="1">4</overlay>
<overlay number="2">7</overlay>
</overlays>
</master>
我只需在“Overlays”元素中选择“Overlay”并检索标签之间的值。我不知道如何具体选择这个。以下是我目前拥有的两个主要解析器函数,其中注意到一般节点“Overlay”而不是特定的“Overlays”
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
if elementName == "overlay" {
OverlayValue = ""
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
OverlayValue?.append(string)
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "overlay" {
OverlayXML.append(OverlayArray(value: OverlayValue!))
OverlayValue = nil
}
}
答案 0 :(得分:1)
当我需要处理此问题时,我使用了一些实例变量来跟踪我的位置。
var inInputs = false
var inOverlays = false
然后更新您的didStartElement
以查找&#34;输入&#34;并设置inInputs = true
。并查找overlays
并设置inOverlays = true
。对didEndElement
执行相同操作,但将标记设置回false
。
然后,您可以将if elementName == "overlay" {
更新为if elementName == "overlay" && inOverlays {
。对input
进行类似的更改。
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
if elementName == "overlays" {
inOverlays = true
} else if elementName == "inputs" {
inInputs = true
} else if elementName == "overlay" && inOverlays {
OverlayValue = ""
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "overlays" {
inOverlays = false
} else if elementName == "inputs" {
inInputs = false
} else if elementName == "overlay" && inOverlays {
OverlayXML.append(OverlayArray(value: OverlayValue!))
OverlayValue = nil
}
}