用于返回节点名称数组及其文本内容的XPath表达式

时间:2017-06-27 17:59:32

标签: java xml xpath

<?xml version="1.0"?>
<shop>
    <order>
        <name>Mr A Beasy</name>
        <date>12/03/2017</date>
        <payment>Debit Card</payment>
    </order>
    <order>
        <name>Mrs D Ehffi</name>
        <date>13/04/2017</date>
        <payment>Paypal</payment>
    </order>
</shop>

以上面的xml为例,我试图检索每个订单&#39;以及其中包含的节点名称和文本内容。我希望最终将每个namedatepayment的文本内容保存到java对象中的相应字段。

问题是,namedatepayment节点并不总是保证在那里。所以我需要一种方法来首先检查name节点是否存在且不为空,然后提取其文本内容并将其保存到我的java对象。

我试过了:

NodeList nodeList = (NodeList) path.evaluate("/shop/order", doc, XPathConstants.NODESET);
String name = nodeList.item(i).getNodeName();
String text = nodeList.item(i).getTextContent();

我希望这会给我一个很好的阵列,有两个&#39;命令&#39;我可以迭代的节点集并获取节点及其内容的值,但它不起作用。出于某种原因,我的nodeList中有一堆\n

我不确定如何在我的nodeList中搜索名为name的特定节点,如果存在则提取其值。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

  

我希望这会给我一个很好的数组,其中有两个'order'节点集   我可以迭代并获取节点及其值的值   内容,但它不起作用。出于某种原因,我的nodeList有一堆   其中的\ n。

在您提供的示例XML中,<order>元素包含不同类型的子元素。 <name><date><payment>元素有元素节点,但也有文本节点包含空格和换行符的组合。每个节点的文本内容由文档节点子节点(仅)与该节点及其所有后代的串联组成,按文档顺序排列。

XPath表达式/shop/order求值为包含两个Node个对象的节点集,每个对象代表一个此类<order>节点。这可能很适合您的目的,但在这些节点上调用getTextContent()则不会,因为结果不包含哪些文本来自哪个元素的信息。

您可以通过至少两种方式获得您想要的内容 - 每个<order>元素子元素的名称和内容:

  • 通过使用<order>节点作为上下文或
  • 评估其他XPath表达式
  • 使用DOM方法遍历以每个<order>为根的子树。

XPath方法的重量有点重,但它可以更加紧凑地表达,它可以自然地处理丢失或不同顺序的子元素。我不确定我会首先选择XPath来获得具有如此简单形式的数据,但是既然你已经这样做了,你也可以继续使用它。