【问题标题】:How can I read all child elements of a XML file using Java?如何使用 Java 读取 XML 文件的所有子元素?
【发布时间】:2020-10-22 17:58:06
【问题描述】:

目标:读取整个 XML 文件并仅返回特定值,在本例中为“用户名”和“密码”,因此我验证用户登录。

问题:程序读取“users.xml”文件时,返回“user id=0001”的所有属性和值,但其他子元素如“user id=0002” “它不会回来。就像文件中除了第一个元素外没有其他内容一样。

我尝试过的:使用 for 循环打印文件中的所有信息以逐行读取,它工作得很好,但是在获取一个特定值时,它只能看到第一个。

我想知道如何使“getUser()”返回文件中的任何“用户名”和“密码”?

这是我目前所拥有的:

users.xml

<!--I made some modifications in the password field-->
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <!DOCTYPE Users>
    <Users>
        <User id = "0001">
            <firstname>sinead</firstname>
            <lastname>o'connor</lastname>
            <email>sinead@oconnor.ie</email>
            <username>sinead</username>
            <password>oconnor</password>
        </User>
    
        <User id= "0002">
            <firstname>John</firstname>
            <lastname>Don</lastname>
            <email>john@don.ie</email>
            <username>john</username>
            <password>pass</password>
        </User>
    
    </Users>

readFile() 方法

    void readFile(){
        String pathXML = "src/user_system/my_library/xml/users.xml";
        File usersXML = new File(pathXML);

try {
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
        Document document = documentBuilder.parse(usersXML);
        document.getDocumentElement().normalize();

    } catch (ParserConfigurationException | SAXException | IOException e) {
        e.printStackTrace();
    }
}

getUser() 方法

    //I just split between readFile() and getUser() for better readability.
//Just changed "Users" to "User".
        void getUser(){
            NodeList nodeList = document.getElementsByTagName("User");
    
            for (int i =  0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);

            //I also modified this bit.
                Element xmlElement = (Element)nodeList.item(i);
    
                String usernameElement = xmlElement.getElementsByTagName("username").item(0)
                        .getTextContent();
                String passwordElement = xmlElement.getElementsByTagName("password").item(0)
                        .getTextContent();
    
                if (!usernameElement.equals(users.getUsername())){
                    System.out.println("\nUsername "+ "\""+ users.getUsername()+ "\"" + 
                                      " was not found in our registry." + "\nPlease try again");
    
               //users.login() is just a simple username/password form in another class.
                   users.login();
                }
                else if(!passwordElement.equals(users.getPassword())){
                    System.out.println("\nWrong password. Please try again.");
                    users.login();
                }else {
                    System.out.println("Welcome " + WordUtils.capitalize(xmlElement.getElementsByTagName("firstname").item(0)
                            .getTextContent())+ " " +WordUtils.capitalize(xmlElement.getElementsByTagName("lastname").item(0).getTextContent()));
                }
            }
        }

我更新了代码,但我仍然无法获取其他用户,只能获取第一个用户。 我得到以下输出:

Please, choose one of the options below:

1) Press 1 to Log In.
2) Press 2 to Create an Account.
3) Press 3 to Log Off.
>  1
Log In.

Please, enter your username: 
>  john

Please, enter your password: 
>  pass

Username "john" was not found in our registry.

感谢任何帮助。

【问题讨论】:

    标签: java xml validation authentication


    【解决方案1】:

    您可以根据标签名称选择所有节点,这里您使用Users作为基础节点,但您也可以通过调用查询User标签,

    NodeList nodeList = document.getElementsByTagName("User");
    

    从xml文档的根目录使用上面的代码,您只有User节点,一旦您拥有所有User节点,您就可以一个一个地迭代它并查询用户节点内部的节点,如下所示。

    NodeList nodeList = document.getElementsByTagName("User");
                for(int i=0;i<nodeList.getLength();i++) {
                    Element xmlElement = (Element)nodeList.item(i);
                    System.out.println(xmlElement.getElementsByTagName("username").item(0).getTextContent());
                    System.out.println(xmlElement.getElementsByTagName("password").item(0).getTextContent());
                }
    

    请注意,在您的示例 xml 用户名和密码标签中,您可能需要更改这些值以验证输出。

    【讨论】:

    • 感谢您回答 Sariq,我做了所有修改:用户>>用户; (Element)node>> (Element)nodeList.item,以及文件中的密码,但不幸的是我仍然遇到同样的问题。
    • 如果您可以修改问题中的代码以显示您现在遇到的问题。
    • 我根据你的建议更新了。我还是想不通。
    • 当我像您的代码一样打印时,我得到以下输出: - 请输入您的用户名:> john - 请输入您的密码:> pass -sinead -oconnor - 找不到用户名“john”在我们的注册表中。
    【解决方案2】:

    一些输出会有所帮助。 我的猜测是,当您创建节点列表时,您正在创建一个长度为 1 的列表,因为“用户”将抓取带有标签“用户”的单个元素。

    NodeList nodeList = document.getElementsByTagName("Users");

    你可能想用

    填充节点列表

    NodeList nodeList = document.getElementsByTagName("User");

    【讨论】:

    • 它触发“if (!usernameElement.equals(users.getUsername()))”条件,显示“在我们的注册表中找不到用户名“john”。”我确实从用户>>用户进行了修改,但我仍然遇到同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多