【问题标题】:Java Document builder returning null Document for Xml StringJava 文档构建器为 Xml 字符串返回空文档
【发布时间】:2017-01-19 21:53:09
【问题描述】:

我已经在 Stackoverflow 上尝试了所有可能的answers,但我无法解决这个问题。

我有以下 xml 作为字符串:

private static final String xmlStr = "<parameters>\n" +
            "  <parameter>\n" +
            "    <name>emp</name>\n" +
            "    <keyvalue>John Smith</keyvalue>\n" +
            "  </parameter>\n" +
            "  <parameter>\n" +
            "    <name>age</name>\n" +
            "    <keyvalue>22</keyvalue>\n" +
            "  </parameter>\n" +
            "  <parameter>\n" +
            "    <name>Birth Date</name>\n" +
            "    <keyvalue>02/05/1978</keyvalue>\n" +
            "  </parameter>\n" +
            "  <parameter>\n" +
            "    <name>password</name>\n" +
            "    <keyvalue>ye63633</keyvalue>\n" +
            "  </parameter>\n" +
            "</parameters>";

参数可以替换成任意字符串(我试过没有成功),下面的代码返回空文档:

 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new ByteArrayInputStream(xmlStr.getBytes("UTF-8")));

我尝试将文档替换为:

Document document = builder.parse(new InputSource(new StringReader(xmlStr)));//This used to work 2 weeks ago.

document 一直在返回空文档,我不知道我做错了什么。几周前使用相同的代码。

我使用的是 Java 1.8 !!

感谢您的帮助。

更新:

这是采用上述 xmlStr 并尝试访问员工年龄的完整代码。

private String getElementValue(String tagName, String xmlString) {

        try {

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new InputSource(new StringReader(xmlString)));
            Element rootElement = document.getDocumentElement();

            NodeList list = rootElement.getElementsByTagName(tagName);

            if (list != null && list.getLength() > 0) {
                NodeList subList = list.item(0).getChildNodes();

                if (subList != null && subList.getLength() > 0) {
                    return subList.item(0).getNodeValue();
                }
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        return null;
    }

根据 cmets,文档根本不为空,但访问所需的 xml 标记时存在问题。所以代码NodeList list = rootElement.getElementsByTagName("age"); 大小为 0。即它根本没有进入循环。

【问题讨论】:

  • “空文档”究竟是什么意思?你只是依赖document.toString()的结果吗?
  • 我会在一秒钟内发布确切的错误。
  • 如果您可以将问题改写为minimal reproducible example,那真的很有帮助...
  • @JonSkeet 我对此感到满意。我忘了输入确切的错误。我现在放一个截图。让我知道它是否还需要更多信息。谢谢!
  • 我没有看到任何错误。我看到一个包含文本“null”的toString() 结果,但这绝对不是错误。您是否尝试过实际使用该文档?请注意,调试器显示 39 个节点...

标签: java xml parsing xml-parsing xmldocument


【解决方案1】:

它似乎工作正常。在builder.parse 之后添加的以下代码表明正在解析 XML:

System.out.println("Root element: " + document.getDocumentElement().getNodeName());
NodeList nodeList = document.getElementsByTagName("parameter");
for (int temp = 0; temp < nodeList.getLength(); temp++) {
    org.w3c.dom.Node node = nodeList.item(temp);
    System.out.println("\nCurrent element: " + node.getNodeName());
    if (node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
        Element element = (Element) node;
        System.out.println("Name: " + element.getElementsByTagName("name").item(0).getTextContent());
        System.out.println("Key Value: " + element.getElementsByTagName("keyvalue").item(0).getTextContent());
    }
}

输出:

Root element: parameters

Current element: parameter
Name: emp
Key Value: John Smith

Current element: parameter
Name: age
Key Value: 22

Current element: parameter
Name: Birth Date
Key Value: 02/05/1978

Current element: parameter
Name: password
Key Value: ye63633

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    相关资源
    最近更新 更多