有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于返回节点名称及其文本内容数组的java 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为例,我试图检索每个“订单”以及其中包含的节点名称和文本内容。我希望最终将每个namedatepayment的文本内容保存到java对象中的相应字段中

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

我试过:

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

我希望这会给我一个很好的数组,其中包含两个“有序”节点集,我可以遍历它们并获得节点的值和它们的内容,但它不起作用。出于某种原因,我的nodeList中有一堆\n

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


共 (1) 个答案

  1. # 1 楼答案

    I hoped this would give me a nice array with two 'order' nodesets that I could iterate through and get the values of the nodes and their contents, but it doesn't work. For some reason my nodeList has a bunch of \n in it.

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

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

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

    • 通过使用<order>节点作为上下文计算其他XPath表达式,或者
    • 通过使用DOM方法遍历每个<order>上的子树

    XPath方法有点重,但它的表达方式要紧凑得多,并且它自然地处理缺少的子元素或不同顺序的子元素。我不确定我是否会首先选择XPath作为具有如此简单形式的数据,但既然已经选择了XPath,那么不妨继续使用它