Swift XMLParser // Выбор узла на основе элемента и атрибута - PullRequest
0 голосов
/ 09 июня 2018

У меня есть XMLParser со Swift, который отлично работает.Однако время от времени появляются узлы, имена которых совпадают с реальными узлами, которые я хочу.Поэтому, когда появляются эти дополнительные узлы, все портится.Вот пример хорошего сценария.Это было немного упрощено, чтобы помочь объяснить.

<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>

Мне нужно выбрать только «Наложение» в элементах «Наложения» и извлечь значение между тегами.Я не знаю, как выбрать это конкретно.Вот две основные функции синтаксического анализатора, которые у меня есть на данный момент, где отмечается общий узел «Наложение» вместо конкретных «Наложений»

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 голосов
/ 09 июня 2018

Когда мне нужно было разобраться с этим, я использовал несколько переменных экземпляра, чтобы отслеживать, где я нахожусь.

var inInputs = false
var inOverlays = false

Затем обновите свой didStartElement, чтобы найти «входы» иустановить 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
    }
}
...