Java XPath查询求助:如何获取指定模块下学生的姓名及成绩节点
解决Java XPath查询问题的方案
问题根源
你第二个XPath表达式出错的原因很明确:
nombre/UF1/UF2/UF3是嵌套路径,但XML里UF1、UF2、UF3是和nombre同级的节点,都是alumno的直接子节点,并非nombre的子节点- 你没添加筛选条件定位到
Steve Rogers对应的alumno节点,就算路径改对,也会拿到M01下所有学生的UF值
正确的XPath表达式
1. 单独提取每个字段
- 姓名:
/modulos/modulo[@m='M01']/alumno[nombre='Steve Rogers']/nombre/text() - UF1:
/modulos/modulo[@m='M01']/alumno[nombre='Steve Rogers']/UF1/text() - UF2:
/modulos/modulo[@m='M01']/alumno[nombre='Steve Rogers']/UF2/text() - UF3:
/modulos/modulo[@m='M01']/alumno[nombre='Steve Rogers']/UF3/text()
2. 一次性提取所有目标文本节点
如果想一次获取姓名+三个UF值的所有文本,可以用节点集联合语法:
/modulos/modulo[@m='M01']/alumno[nombre='Steve Rogers']/(nombre|UF1|UF2|UF3)/text()
Java代码示例
以下是完整的Java实现代码,演示如何获取这些值:
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; public class XPathQueryExample { public static void main(String[] args) { try { // 加载XML文档 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("你的XML文件路径.xml"); // 初始化XPath XPath xpath = XPathFactory.newInstance().newXPath(); // 一次性获取所有目标文本 XPathExpression expr = xpath.compile("/modulos/modulo[@m='M01']/alumno[nombre='Steve Rogers']/(nombre|UF1|UF2|UF3)/text()"); NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); // 遍历输出结果 for (int i = 0; i < nodes.getLength(); i++) { System.out.println(nodes.item(i).getNodeValue()); } } catch (Exception e) { e.printStackTrace(); } } }
额外说明
- 如果XML里存在同名学生(比如Bruce Banner出现在多个模块),
alumno[nombre='Steve Rogers']的筛选条件可以精准定位到目标学生 - 若需要获取完整的节点对象而非仅文本,去掉
/text()即可
内容的提问来源于stack exchange,提问作者Looking for a answer ...
相关产品推荐
相关产品推荐

