如何用XPath匹配含Identifiant值的外部字符串对应的DOSSIER节点
解决方法
核心问题是你把contains的参数搞反了。原写法是检查Identifiant节点内容是否包含外部字符串,但实际你需要的是检查外部字符串是否包含Identifiant的内容。
基础写法
如果外部字符串是固定值(比如"100715_klingon_uiiu"),直接把外部字符串放在contains的第一个参数位置即可:
Archive/DOSSIER[contains("100715_klingon_uiiu", Identifiant)]
这个表达式会遍历所有DOSSIER节点,判断外部字符串是否包含当前节点下Identifiant的文本内容,匹配成功的节点会被选中。
动态传入外部字符串的场景
如果外部字符串是动态变量(比如读取的文件名),建议通过变量传入的方式使用XPath,避免直接拼接字符串引发的语法问题或注入风险。以下是两种常见语言的示例:
Python(lxml库)
from lxml import etree # 加载XML内容 xml_content = """<Archive Lot="1"> <DOSSIER> <Identifiant>100715</Identifiant> <Personne> <LIBL>File</LIBL> </Personne> </DOSSIER> <DOSSIER> <Identifiant>3455667</Identifiant> <Personne> <LIBL>File2</LIBL> </Personne> </DOSSIER> </Archive>""" filename = "100715_klingon_uiiu" tree = etree.fromstring(xml_content) # 传入变量执行XPath查询 matched_nodes = tree.xpath('Archive/DOSSIER[contains($filename, Identifiant)]', filename=filename) print(f"匹配到{len(matched_nodes)}个节点")
Java(javax.xml.xpath)
import javax.xml.xpath.*; import org.w3c.dom.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.StringReader; public class XPathMatchExample { public static void main(String[] args) throws Exception { String xml = "<Archive Lot=\"1\">\n" + " <DOSSIER>\n" + " <Identifiant>100715</Identifiant>\n" + " <Personne>\n" + " <LIBL>File</LIBL>\n" + " </Personne>\n" + " </DOSSIER>\n" + "<DOSSIER>\n" + " <Identifiant>3455667</Identifiant>\n" + " <Personne>\n" + " <LIBL>File2</LIBL>\n" + " </Personne>\n" + " </DOSSIER>\n" + "</Archive>"; String filename = "100715_klingon_uiiu"; // 解析XML文档 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new StringReader(xml)); // 配置XPath并传入变量 XPath xpath = XPathFactory.newInstance().newXPath(); xpath.setXPathVariableResolver(varName -> { if (varName.getLocalPart().equals("filename")) { return filename; } return null; }); // 执行查询 NodeList nodes = (NodeList) xpath.evaluate("Archive/DOSSIER[contains($filename, Identifiant)]", doc, XPathConstants.NODESET); System.out.println("匹配到的节点数:" + nodes.getLength()); } }
关键说明
contains(A, B)的逻辑是:若字符串A包含子串B则返回true,反之返回false。你的需求是用外部字符串(A)匹配Identifiant的内容(B),因此必须将外部字符串放在第一个参数位置。- 若外部字符串包含特殊字符(如引号、斜杠),务必使用变量传入的方式,不要直接拼接字符串到XPath表达式中,避免语法错误或安全风险。
内容的提问来源于stack exchange,提问作者Pick
相关产品推荐
相关产品推荐

