Я попытался разобрать теги let contentString = "<p>abcdefg</p><p>hijklmn</p><p>123456</p>", которые являются HTML-тегами, с помощью XMLParser.
Когда я печатаю имя элемента и содержимое между тегом в методах XMLParserDelegate, был напечатан только первый тег (p, abcdefg).
let contentString = "<p>abcdefg</p><p>hijklmn</p><p>123456</p>"
if let data = contentString.data(using: .utf8) {
let parser = XMLParser(data: data)
parser.parse()
}
XMLParserDelegate методы
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
print(elementName)
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
print(string)
}
console log
p
abcdefg
Я не знаю, почему синтаксический анализатор прекращает синтаксический анализ на первом теге (p)





Есть много проблем с вашим кодом, но главная из них заключается в том, что ваш contentString не является допустимым XML. Из-за этого нет хорошего способа заставить XMLParser проанализировать всю строку.
(На самом деле я очень впечатлен тем, что он сделал. Вместо того, чтобы задыхаться, он анализировал до тех пор, пока не закончилась действительность XML, а затем остановился.)
Действительный XML должен состоять из одного корневого элемента; Например
<root><p>abcdefg</p><p>hijklmn</p><p>123456</p></root>
После того, как вы изменили свой XML, чтобы сделать его действительным, вам нужно будет подумать о том, как поступить с делегатом, чтобы проанализировать XML это. Но это другое дело.
Ну, например, вполне возможно, что foundCharacters будет вызываться много раз для одного текстового узла. Ваш код должен быть подготовлен к этому. И, конечно же, политика объявления одного делегата для синтаксического анализатора усложняет анализ более сложных иерархий.
Это сработало после добавления корневого элемента в contentString. Спасибо. Можно поконкретнее о многих проблемах, кроме основной?