使用 SAX 解析器动态读取标记

Reading tags dynamically using SAX parser

提问人:Vishnu 提问时间:4/26/2020 更新时间:4/27/2020 访问量:338

问:

我正在尝试使用 SAX 解析器动态读取 XML,我尝试使用示例,但在这种情况下,我必须对所有子标签进行硬编码(创建一个变量),请建议 SAX 中是否有任何可用的功能。

示例 XML:

<cloudHubDeployment>
                    <uri>https://anypoint.mulesoft.com</uri>
                    <muleVersion>${muleVersion}</muleVersion>
                    <username>${username}</username>
                    <password>${password}</password>
                    <properties>
                        <env>${env}</env>
                    </properties>
</cloudHubDeployment>

我的要求是读取里面的所有子标签及其后续值

Java XML 解析 SAX SAXPasParser

评论


答:

1赞 Lakshan 4/27/2020 #1

尝试以下解决方案,

try {
    File inputFile = new File("Input.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document document = dBuilder.parse(inputFile);
    document.getDocumentElement().normalize();
    Element rootElement = document.getDocumentElement(); // gets the document's root element (cloudHubDeployment)
    NodeList nodeList = rootElement.getElementsByTagName("*"); // get all child elements under the root (cloudHubDeployment) element
    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);
        if (node.getNodeType() == Node.ELEMENT_NODE) {
            Element element = (Element) node;
            System.out.println("Element Name : "+node.getNodeName()+", "
            + "Value : "+element.getTextContent().trim());
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

输出

Element Name : uri, Value : https://anypoint.mulesoft.com
Element Name : muleVersion, Value : ${muleVersion}
Element Name : username, Value : ${username}
Element Name : password, Value : ${password}
Element Name : properties, Value : ${env}
Element Name : env, Value : ${env}

收集 XML 文件中的所有元素和值,

NodeList nodeList = document.getElementsByTagName("*");
for (int temp = 0; temp < nodeList.getLength(); temp++) {
    Node node = nodeList.item(temp);
    if (node.getNodeType() == Node.ELEMENT_NODE) {
        Element element = (Element) node;
        System.out.println("Element Name : "+node.getNodeName()+", "
        + "Value : "+element.getTextContent().trim());
    }
}

评论

0赞 Vishnu 4/27/2020
在这种情况下,我必须只读取那些标签及其在 <cloudHubDeployment> 下的值,其余的应该被忽略,最好使用 SAX 解析器,基本上,处理应该在获得 <cloudHubDeployment 的结束标签后立即停止>
0赞 Lakshan 4/27/2020
请参考上面修改后的答案。如果它适合您,请接受:)答案。谢谢
0赞 Vishnu 4/29/2020
用例对我不起作用......因为我的要求是收集<cloudHubDeployment>下的所有属性,然后检查所有子属性值,如果其统计信息为“${”
0赞 Lakshan 4/30/2020
是否要在标签下获取所有 elalements 及其值(不带大括号)<cloudHubDeployment>