Swift XMLParser //选择基于元素和节点的节点属性

时间:2018-06-09 04:51:18

标签: swift xml xml-parsing

我有一个使用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
    }

}

1 个答案:

答案 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
    }
}