java—使用xpath从重复的xml节点检索值

tcomlyy6  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(393)

我对xml解析和java是新手。我正在尝试使用xpath解析xml。xml如下所示

<Root>
 <AL1>
  <AL1.1>1</AL1.1>
  <AL1.2>1</AL1.2>
  <AL1.3>
    <CX1.1>Bala</CX1.1>
  </AL1.1>
<AL1>
<AL1>
  <AL1.1>2</AL1.1>
  <AL1.2>1</AL1.2>
  <AL1.3>
    <CX1.1>Bala1</CX1.1>
  </AL1.1>
<AL1>
<AL1>
  <AL1.1>3</AL1.1>
  <AL1.2>1</AL1.2>
  <AL1.3>
    <CX1.1>Bala2</CX1.1>
  </AL1.1>
<AL1>
</Root>

为了获得cx1.1 value/al1/al1.3/cx1.1/text(),我构建了如下xpath。到目前为止,我只能得到第一次出现,如果cx1.1。

XPathExpression expr = xpath.compile("/AL1/AL1.3/CX1.1/text()");
result = (String) expr.evaluate(doc.XPathConstants.STRING);

你们能告诉我一种使用xpath在列表中获取cx1.1所有不同值的方法吗。非常感谢您的帮助。谢谢您。

icnyk63a

icnyk63a1#

首先,将xml固定为格式良好的:
这个 AL1.3 开始标记不应用 AL1.1 结束标记,以及
你的 AL1 开始标记应该用 AL1 结束标记,而不是开始标记。
更正的xml:

<Root>
  <AL1>
    <AL1.1>1</AL1.1>
    <AL1.2>1</AL1.2>
    <AL1.3>
      <CX1.1>Bala</CX1.1>
    </AL1.3>
  </AL1>
  <AL1>
    <AL1.1>2</AL1.1>
    <AL1.2>1</AL1.2>
    <AL1.3>
      <CX1.1>Bala1</CX1.1>
    </AL1.3>
  </AL1>
  <AL1>
    <AL1.1>3</AL1.1>
    <AL1.2>1</AL1.2>
    <AL1.3>
      <CX1.1>Bala2</CX1.1>
    </AL1.3>
  </AL1>
</Root>

更正的xpath
然后修复xpath以考虑 Root 元素,

/Root/AL1/AL1.3/CX1.1/text()

或者无视 CX1.1 所有要素:

//CX1.1/text()

更正的java
最后,请参阅marygrass关于如何修复java代码以使给定类型的 XPathConstants.NODESET ,不是 XPathConstants.STRING .

n3ipq98p

n3ipq98p2#

首先,您提供的xml格式不正确,但一旦格式正确,我将执行以下操作:

String expression = "//AL1/AL1.3/CX1.1/text()";

        NodeList list = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);

        List<String> strings = new ArrayList<String>();

        for (int i = 0; i < list.getLength(); i++) {
            strings.add(list.item(i).toString());
        }

将xpath查询的结果保存在 NodeList 然后遍历它以将每个值保存在 List<String> 有一个循环。

相关问题