java 获取子节点,关于Java:使用xpath获取子节点?

我有以下xml。 我需要使用xpath查询获取根节点的所有子节点。 我该如何写xpath表达式?

12345

Name1

6789

Name2

该表达式应返回以下结果:

12345

Name1

6789

Name2

我尝试使用rootElement/rootElementOne/*,但没有结果。

谢谢!

您是否尝试过rootElementrootElementOne?

@ beny23:注意上的默认名称空间声明。

在这里提防术语。在XML中,至少在XPath术语中,"根节点"是文档中所有元素,文本节点,注释,处理指令和其他节点的(不可见)祖先。根节点由XPath表达式/寻址。它不是元素,而是最外层元素(也称为document元素)的父元素。在XML文档中,根节点是的父节点。

此XPath表达式将选择所有"根节点的子节点":

/node()

但这将返回一个元素,即,这不是您想要的结果。

相反,您可能需要document元素的所有子节点,所以这是您的XPath表达式:

/*/node()

这将返回元素,以及(取决于您的设置)它们之间的文本节点,该文本节点由空格组成。

另外,也许您想要document元素的所有子元素。换句话说,除了元素之外,您无需关心文本节点,注释或其他任何内容。 (许多不熟悉XML细节的人在表示"元素节点"时都说"节点"。)

如果这就是您想要的,则它的XPath表达式是

/*/*

或者您可以

/rootElement/some:rootElementOne

其中some在XPath外部声明为http://some.com的名称空间前缀。如果您想知道如何在Java中声明XPath的名称空间前缀,请告诉我们,并向我们展示您已经在使用什么Java代码来调用XPath。或者更好的是,在此站点上搜索,因为示例代码已经有了很好的答案。

尝试rootElement/rootElementOne/*时,由于名称空间而未选择任何内容。格式为rootElementOne的XPath步骤(在XPath 1.0中)表示"没有命名空间的名为rootElementOne的元素"。 (在XPath 2.0中,它的意思是"在默认XPath命名空间中",并且在XPath之外还有其他方法可以设置默认XPath命名空间。)因此,您在没有名称空间的情况下要求输入rootElementOne,而在元素中http://some.com名称空间。

如果要与名称空间无关,可以使用*而不是rootElementOne,或者可以使用*[local-name() = 'rootElementOne']。但是,如果这样做是因为您不知道如何在XML和XPath中使用命名空间,那么在学习之前,它们可能仍然是您的绊脚石。 :-)

解决此问题后,您应该获得两个元素(因为要求输入rootElementOne的子元素),但这仅在文档根节点的上下文中有效。这是因为以元素名称X开头的XPath表达式实际上是以child::X开头的,这意味着上下文节点的子级。如果您当时不知道上下文节点是什么,或者不想依赖它,请使用/或//开始XPath表达式。这告诉XPath从文档的根节点开始。

/rootElement/*将返回所有rootElementOne,您可以在其中执行某些操作

/rootElement//*将返回rootElement以下的所有内容

较小的更正:rootElement*将选择作为rootElement后代的所有元素。 它不会选择文本节点等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成XPath: 如果你有一个XML节点,可以使用getNodePath()方法来获取该节点的XPath。 例如,假设你有一个org.w3c.dom.Node对象,通过调用getNodePath()方法,你可以获取该节点的XPath: Node node = ...; String xpath = ((org.apache.xpath.Node) node).getNodePath(); 获取XPath: 如果你已经知道了要获取的节点的XPath,可以使用javax.xml.xpath包中的XPath API来获取该节点。 例如,假设你有以下XML文档: <?xml version="1.0" encoding="UTF-8"?> <root> <element1>value1</element1> <element2> <subelement1>value2</subelement1> <subelement2>value3</subelement2> </element2> </root> 要获取根节点的XPath,你可以使用如下代码: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File("path/to/xml/file.xml")); XPathFactory xPathfactory = XPathFactory.newInstance(); XPath xpath = xPathfactory.newXPath(); String rootNodeXPath = "/"; Node rootNode = (Node) xpath.evaluate(rootNodeXPath, doc, XPathConstants.NODE); 要获取子节点element1的XPath,你可以使用如下代码: String element1XPath = "/root/element1"; Node element1 = (Node) xpath.evaluate(element1XPath, doc, XPathConstants.NODE); 要获取子节点element2下的子节点subelement1的XPath,你可以使用如下代码: String subelement1XPath = "/root/element2/subelement1"; Node subelement1 = (Node) xpath.evaluate(subelement1XPath, doc, XPathConstants.NODE);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值