Xpath仅选择元素的第一个实例

超人

我正在javax.xml.xpath.XPath;尝试解析一些XML

有时一个特定的元素可能会出现多次,这时我想选择所有元素。

我有以下内容XML(标记名称和值已更改)

<Pearent>
 <a>hello</a>
 <a>world</a>
 <b>bye</b>
</Pearent>

我想获取所有节点的文本值

结果直接插入到中Java HashMap,然后使用访问Thymeleaf

如果我使用以下内容xpath /Pearent/a,我会得到"hello"

如果我使用/Pearent/a[1]我得到"hello"

如果我使用,/Pearent/a[2]我会得到“世界”

我还尝试过仅针对该Pearent节点,因此如果使用,/Pearent我会得到"\n hello\n world\n bye\n"(请注意格式"\n "已自动插入)

我无法将现成的节点作为解决我的问题的方法,因为有时一个Pearent节点还有其他我不想要的子节点。

有趣的是我已经试过相同XML,并XPath在网上解析器http://www.freeformatter.com/xpath-tester.html

我得到不同的结果

如果使用xpath /Pearent/a,我得到<a>hello</a><a>world</a>

如果使用xpath /Pearent/a[1],我得到<a>hello</a>

如果使用xpath /Pearent/a[2],我得到<a>world</a>

如果使用xpath /Pearent,我得到<Pearent><a>hello</a><a>world</a><b>bye</b></Pearent>

我在这里看到2个差异:

  1. 在线解析器返回整个节点,我的解析器仅返回节点的文本内容
  2. 在线解析器会选择所有匹配的元素,而我的解析器只会选择第一个匹配的元素。

我的解析器功能如下

我的问题是:

  • 当我xpath针对具有多个子节点的节点时,如何控制似乎要插入的格式

  • 如何获取所有子节点的文本值作为字符串(即,Xpath /Pearent/a我想获取"helloworld"

  • 如何将结果作为单独的节点返回,以便可以foreach在其中使用循环Java(请记住我说过结果已传递到hashmap值中)或ThymeLeaf

我的XML解析器代码

public String readValue(String XML , String Xpath) throws Exception{

        final DocumentBuilderFactory builderFactory =     DocumentBuilderFactory.newInstance();
        builderFactory.setNamespaceAware(Boolean.parseBoolean(propertyConfiguration.getNameSpaceAware()));
    final DocumentBuilder builder = builderFactory.newDocumentBuilder();
    Document xml = builder.parse(new InputSource(new StringReader(XML)));

    final XPath xPath = XPathFactory.newInstance().newXPath();

    String retrievedValue = xPath.compile(Xpath).evaluate(xml);

    return retrievedValue;
}

解析器功能正在通过以下方式调用

Map requiredData = new HashMap();
requiredData.put("Title","/Pearent/a");
拉维·马卡(Ravi MCA)

您可以evaulate()像下面那样修改您的方法。

你可以得到所有的标记名称的节点a使用xpath,然后循环访问节点,并得到文本标记内。

NodeList node = (NodeList) xPath.evaluate( "/Pearent/a", xml, XPathConstants.NODESET );

StringBuilder stringBuilder = new StringBuilder();

for ( int i = 0; i < node.getLength(); i++ ) {

    stringBuilder.append( node.item( i ).getTextContent() );    
}

System.out.println( stringBuilder.toString() );

输出:

你好,世界

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章