【问题标题】:Java - convert xml object to StringJava - 将 xml 对象转换为字符串
【发布时间】:2013-07-24 08:22:49
【问题描述】:

因此,我使用 xPath 从 xml 文档中提取特定标签和元素并将其存储在对象中。我的问题是如何将此对象转换为字符串。我已经尝试过 .toString() 方法,但它给我的只是以下内容:

LocalHost 测试:org.apache.xml.dtm.ref.DTMNodeList@717e717e

我的代码如下:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
            domFactory.setNamespaceAware(true); // never forget this!
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            org.w3c.dom.Document doc =  builder.parse("src/webSphere/testcases/positiveCode-data.xml");

            XPathFactory factory = XPathFactory.newInstance();
            XPath xpath = factory.newXPath();
            XPathExpression expr 
             = xpath.compile(" /tests/class/method/params[@name='config']/param/text()");
            MQQueueConnectionFactory cf = new MQQueueConnectionFactory();
            Object result = expr.evaluate(doc, XPathConstants.NODESET);


            System.out.println("LocalHost test: " + result.toString());

这是我的 xml 文件:

<?xml version ="1.0" encoding = "UTF-8"?>
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://jtestcase.sourceforge.net/dtd/jtestcase2.xsd">
    <class name="Success">
        <method name="success">
            <test-case name="positive-code">
                <params name="config">
                    <param name="hostName" type="java.lang.String">localhost</param>
                    <param name="port" type="int">7080</param>
                    <param name="transportType" type="java.lang.String">10</param>
                    <param name="queueManager" type="java.lang.String">MB8QMGR</param>
                    <param name="channel" type="java.lang.String">10</param>
                    <param name="inputQueue" type="java.lang.String">10</param>
                    <param name="outputQueue" type="java.lang.String">20</param>
                    <param name="testFile" type="java.lang.String">+</param>
                    <param name="expectedResultFile" type="java.lang.String">+</param>
                </params>
                <asserts>
                    <assert name="result" type="int" action="EQUALS">
                        30
                </assert>
                </asserts>
            </test-case>


        </method>
    </class>
</tests>

【问题讨论】:

  • 你需要重写你想以可读方式打印的Object的toString方法,否则你将使用toString获取Object引用值
  • 我该怎么做?
  • DTMNodeList 似乎没有覆盖 Objects toString()。因此,您必须明确处理 Type DTMNodeList。你确定它总是这种类型吗?

标签: java xml xpath


【解决方案1】:

当然。你可以看到你有一个NodeList的实例。

您可以获取列表的长度,然后获取特定索引处的所有 Node 项目,并根据您对它们的期望将它们打印出来 - 很可能是它们的文本内容,所以 Node#getTextContent()(或任何其他你想要的循环打印出 - 节点名称、节点类型等)。

NodeList resultList = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
int listLength = resultList.getLength();
for (int i = 0; i < listLength; i++) {
    System.out.println("LocalHost test (" + i + "): " + resultList.item(i).getTextContent());
}

编辑

如果您期望单个字符串值,只需这样做

String resultList = (String)expr.evaluate(doc, XPathConstants.STRING);

这会将结果转换为XPath String conversion rules 之后的字符串。

【讨论】:

  • 它没有将 DTMNNodeList 解析为一种类型,我必须导入它还是在某处添加一个 jar?
  • 是的。您指定当您执行expr.evaluate(doc, XPathConstants.NODESET) 时它将返回NodeList。如果您期望一个字符串而不是文本节点列表,您可能想要使用expr.evaluate(doc, XPathConstants.STRING)。无论如何,您将不得不在那里手动编写演员表(这将是安全的)。
  • 我似乎得到了一个空值或空白。我使用以下行只是为了查看我是否得到一个: String result = (String) expr.evaluate(doc, XPathConstants.STRING);但没有运气。我做错了什么?
  • @AndrewMurphy 您的 XPath 表达式错误。您忘记为&lt;test-case name="positive-code"&gt; 添加位置步骤。无论如何,你会得到一个 NodeListString 值,所以我推荐我的解决方案中的第一种方法。
  • 是的,现在才看到。这样一个白痴,没有足够的咖啡。非常感谢斯莱尼克,绅士学者
猜你喜欢
  • 2015-01-13
  • 1970-01-01
  • 2019-04-10
  • 2012-07-11
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
相关资源
最近更新 更多