Разбор XML и проверка значений по значению элемента - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь проверить имя пользователя и пароль, анализируя мой XML-файл, заполненный пользователями. В настоящее время мой метод возвращается как ложный. Предполагается пройти через дочерние элементы <users> и найти пользователя с указанным именем пользователя, а также проверить пароль по параметрам checkUser().

Не получается получить доступ к тексту внутри элемента <password>.

Вот что я пробовал до сих пор:

fun checkUser(username: String, password: String) : Boolean {
    val xmlFile = File("Users.xml")
    val doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile)
    var list = doc.getElementsByTagName("user")
    for (i in 0 until list.length) {
        var current = list.item(i)
        if (current.attributes.getNamedItem("id").nodeValue == username) {
            return current.lastChild.textContent == password //trying to check text against given password
        }
    }
    return false
}

fun main(args: Array<String>) {
    println(checkUser("alec", "123")) //returns false right now
}

Вот мой XML-файл:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
    <user id="alec">
        <username>alec</username>
        <password>123</password>
    </user>
    <user id="john">
        <username>john</username>
        <password>415</password>
    </user>
</users>

EDIT

current.attributes.item(0) возвращает узел, но мне нужно получить атрибут id внутри тега <user> и сравнить его с данным именем пользователя.

EDIT Исправлен код для получения идентификатора и сравнения с параметром username, по-прежнему возвращает значение false

1 Ответ

0 голосов
/ 29 апреля 2018

Если вы напечатаете размер возвращаемого списка NodeList, вызывая current.childNodes, вы получите 5. Первый, третий и последний узлы являются пустыми узлами. ваши данные находятся в узлах 2 и 4. Поэтому вы можете заменить свой код следующим, и он будет работать.

val xmlFile = File("Users.xml")
val doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlFile)
var list = doc.getElementsByTagName("user")
for (i in 0 until list.length) {
    var current = list.item(i)
    if (current.attributes.getNamedItem("id").nodeValue == username) {
        println(current.childNodes.length)

        for (j in 0 until current.childNodes.length) {
            if (current.childNodes.item(j).nodeName == "password") {
                return current.childNodes.item(j).textContent == password
            }
        }
    }
}
return false

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

Например, с DOM4J вы можете заменить весь приведенный выше код на

val doc = SAXReader().read(File("users.xml"))
val users = doc.rootElement.elements("user")
for (user in users) {
    if (user.attribute("id").value == username) {
        return user.element("password").text == password
    }

}
return false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...