Swift-XMLParser//基于元素和属性选择节点
我有一个使用Swift的XMLParser,它工作得很好。但是,有时会出现与我想要的实际节点同名的节点。所以当这些额外的节点出现时,is会把一切都搞砸。下面是一个好场景的示例。这已经被简化了一点来帮助解释Swift-XMLParser//基于元素和属性选择节点,swift,xml,xml-parsing,Swift,Xml,Xml Parsing,我有一个使用Swift的XMLParser,它工作得很好。但是,有时会出现与我想要的实际节点同名的节点。所以当这些额外的节点出现时,is会把一切都搞砸。下面是一个好场景的示例。这已经被简化了一点来帮助解释 <master> <inputs> <input> <input> </inputs> <overlays> <overlay number="
<master>
<inputs>
<input>
<input>
</inputs>
<overlays>
<overlay number="1">4</overlay>
<overlay number="2">7</overlay>
</overlays>
</master>
当我需要处理这个问题时,我使用了一些实例变量来跟踪我的位置
var inInputs = false
var inOverlays = false
然后更新didStartElement以查找输入,并将inInputs设置为true。并查找覆盖,并将inOverlays设置为true。对DiEndElement执行相同的操作,但将标志设置回false
然后可以将if-elementName==overlay{更新为if-elementName==overlay&&inOverlays{。对输入进行类似的更改
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
}
}
var inInputs = false
var inOverlays = false
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
}
}