java - 如何在 java 中使用循环读取 XML 子节点值

标签 java xml

这是我的 xml 代码...

<flow>
    <TaskID>100</TaskID>
    <TaskID>101</TaskID>
    <TaskID>102</TaskID>
    <TaskID>103</TaskID>    
</flow>

我想知道如何在 java 中的 for 循环中获取 taskID 值。请帮助我...

最佳答案

DOM 解析器解决方案,相当简单,不需要额外的库。

public static void main(String[] args) throws SAXException, IOException,
        ParserConfigurationException {

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();

    String input = "<outer>";
    input += "<otherstuff><TaskID>123</TaskID></otherstuff>";
    input += "<flow>";
    input += "<TaskID>100</TaskID>";
    input += "<TaskID>101</TaskID>";
    input += "<TaskID>102</TaskID>";
    input += "<TaskID>103</TaskID>";
    input += "</flow>";
    input += "</outer>";
    Document document = builder.parse(new InputSource(new StringReader(
            input)));

    NodeList flowList = document.getElementsByTagName("flow");
    for (int i = 0; i < flowList.getLength(); i++) {
        NodeList childList = flowList.item(i).getChildNodes();
        for (int j = 0; j < childList.getLength(); j++) {
            Node childNode = childList.item(j);
            if ("TaskID".equals(childNode.getNodeName())) {
                System.out.println(childList.item(j).getTextContent()
                        .trim());
            }
        }
    }
}

如果您的输入来自文件,则需要使用 FileReader。

Document document = builder.parse(new InputSource(new FileReader(
        new File("foo.xml"))));

getElementsByTagName() 的替代方法是 XPath,这是一种 XML 查询语言,如果您要匹配复杂的条件集,这将特别有用。

XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("//flow/TaskID/text()");

Object result = expr.evaluate(document, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
    System.out.println(nodes.item(i).getTextContent());
}

如果您的 XML 文件很大,例如 100 MB/GB,或者您使用的是低内存平台,那么请考虑使用 SAX 解析器。

String input = "<flow><TaskID>100</TaskID><TaskID>101</TaskID><TaskID>102</TaskID><TaskID>103</TaskID></flow>";
SAXParser sax = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new DefaultHandler() {
    private StringBuilder buffer = new StringBuilder();
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        if ("TaskID".equals(qName)) {
            System.out.println(buffer);
            buffer = new StringBuilder();
        }
    }
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        buffer.append(ch, start, length);
    }
    @Override
    public void startElement(String uri, String localName,
            String qName, Attributes attributes) throws SAXException {
        buffer = new StringBuilder();
    }
};
sax.parse(new InputSource(new StringReader(input)), handler);

关于java - 如何在 java 中使用循环读取 XML 子节点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13356534/

相关文章:

java - static函数的情况下如何获取monitor?

c# - 为什么在 Visual Studio 2010 中保存 xml 文件非常慢?

PHP 解析具有不一致对象的 XML 提要

java - 如何在 Selenium webdriver 中将 "unable to locate element"更改为另一条消息,如 "Element doesn' t exist"?

java - 如何使用 Selenium 获取元素颜色

java - 我的 Firebase/Facebook Auth 登录有效,并且不会在我的下一个 Activity 中显示用户用户名 : activity_main. xml

java - struts2中如何获取xml作为响应

Python lxml创建xml文件时在特定节点之间添加换行符

java - 在 Linux 系统上安装 Spring Boot 应用程序

java - 替换字符串的最后一部分