如何使用jdom2从子XML标签获取内部文本?

时间:2015-04-24 10:56:41

标签: java xml jdom-2

我的XML文件结构如下:

<parent xml:space="preserve">
Hello, my name is
    <variable type="firstname">ABC</variable>
and my last name is 
    <variable type="lastname">XYZ</variable>
</parent>

我需要一种以这种格式获取文本输出的方法:

“您好,我的名字是ABC,我的姓氏是XYZ”。

现在使用jdom2的问题是element.getText()方法将整个字符串作为单个字符串返回(不考虑子标记的位置):

“您好,我的名字是,我的姓氏是”。

无论如何,我可以获得子标签的位置/分隔它们,这样即使是手动变量插入也可以在以后的某个时间点完成吗?

2 个答案:

答案 0 :(得分:1)

编辑该示例使用Xerces解析器,该解析器包含在DOM的Java运行时API中。对于JDOM2解决方案,请参阅rolfl的答案。

作为起点,您可以使用以下代码段。根据您真正想要实现的目标,需要自己完成更改。

xml = "<parent xml:space=\"preserve\">\n"
        + "Hello, my name is\n"
        + "    <variable type=\"firstname\">ABC</variable>\n"
        + "and my last name is \n"
        + "    <variable type=\"lastname\">XYZ</variable>\n"
        + "</parent>";

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(xml.getBytes()));
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodeList = (NodeList) xPath.compile("//parent").evaluate(document, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
    System.out.println(nodeList.item(i).getTextContent());
}

输出

Hello, my name is
    ABC
and my last name is 
    XYZ

注意该片段未经过优化。将其视为PoC。

答案 1 :(得分:0)

在JDOM中指定getText以返回元素的直接Text内容。 JDOM还has the method getValue()返回:

  

返回此元素的XPath 1.0字符串值,该元素是此元素的所有文本节点后代的完整有序内容(即在解析所有引用并删除所有其他标记后剩下的文本) 。)

将此应用于您的文档:

    Document doc = new SAXBuilder().build("parentwtext.xml");
    Element root = doc.getRootElement();
    System.out.println(root.getValue());

我得到了输出(我在这里可以显示的开头是空行):

Hello, my name is
    ABC
and my last name is 
    XYZ