如何使用"用于"循环和"如果"循环两者以验证xml文档

时间:2016-06-02 02:30:03

标签: java xml

我正在尝试创建一个登录系统。为此,我需要检查xml文档中是否存在xml元素("用户名"和"密码")。如果匹配"用户名"和#34;密码"需要返回true,否则为false。为此,我使用" for"循环遍历整个文档并使用" if"循环验证。我使用java和dom解析器。

xml文档:

<login>
<user>
    <username>sunimal</username>
    <password>1111</password>
</user>
<user>
    <username>naveen</username>
    <password>852</password>
</user>
<user>
    <username>chamara</username>
    <password>12345</password>
</user></login>

java代码:

boolean a = false;
    try {
        File inputFile = new File("C:\\Users\\Kavindu\\Documents\\NetBeansProjects\\chatserver2\\xml\\userrecord2.xml");
        DocumentBuilderFactory dbFactory
                = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(inputFile);

        NodeList userList = doc.getElementsByTagName("login");

          for (int i = 0; i < userList.getLength(); i++) {
            Node user = userList.item(i);
            Element eElement = (Element) user;

            if (eElement.getElementsByTagName("username").item(i).getTextContent().equals(username) && eElement.getElementsByTagName("password").item(i).getTextContent().equals(password)) {

                a = true;
            } else {
                a = false;
            }
        }




    } catch (Exception ex) {

    }
    return a;
}

如果我输入第一个元素(&#34; sunimal&#34;和&#34; 1111&#34;),我可以得到,但是对于其他元素返回false。我试过&#34;因为&#34;循环和&#34;如果&#34;以不同的方式循环,但我无法得到结果。我是新编程的。

2 个答案:

答案 0 :(得分:1)

这是你的解决方案;我在IDE中检查过这个。谢谢。 : - )

获取标记的第一个元素,您需要使用索引0. eElement.getElementsByTagName("username").item(0)

如果您有匹配的用户名和密码,则需要从循环中退出,

a = true;   打破;

否则在下一次迭代中它将再次设置为false。

public boolean checkLogin(){

boolean a = false;
try {
    File inputFile = new File("C:\\Users\\Kavindu\\Documents\\NetBeansProjects\\chatserver2\\xml\\userrecord2.xml");
    DocumentBuilderFactory dbFactory
            = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(inputFile);
    NodeList userList = doc.getElementsByTagName("user");
    System.out.println("userlist length :: "+ userList.getLength());
      for (int i = 0; i < userList.getLength(); i++) {
        Node user = userList.item(i);
        Element eElement = (Element) user;
        if (eElement.getElementsByTagName("username").item(0).getTextContent().equals(username) && eElement.getElementsByTagName("password").item(0).getTextContent().equals(password)) {

            a = true;
            break;
        } else {
            a = false;
        }
    }




} catch (Exception ex) {
    System.out.println(ex.getMessage());

}
return a;


}

答案 1 :(得分:0)

此代码

NodeList userList = doc.getElementsByTagName("login");

返回单个节点,即根节点(<login>)。你想要的是

NodeList userList = doc.getElementsByTagName("user");

这将返回一个NodeList,每个用户包含一个元素,然后你的for循环将遍历用户。

然后在

if (eElement.getElementsByTagName("username").item(i).getTextContent().equals(username) 
        && 
    eElement.getElementsByTagName("password").item(i).getTextContent().equals(password)) { ...

item(i)更改为item(1)。那时你就是&#34; at&#34; <user>元素,因此用户名和密码是&#34;第一个&#34;那种类型的节点。