Xpath不区分大小写的表达式,用于从XML获取属性

时间:2018-02-05 17:45:43

标签: java xml xpath

我正在阅读一些XML个文件并使用Xpath

的帮助使用某些预定义路径提取一些值

路径如下:

Comprobante/@Fecha

例如,上面的路径将用于提取属性@Fecha,文件看起来像这样:

<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" Fecha="2017-10-25T19:13:19">
</cfdi:Comprobante>

以下是用于获取数据的代码示例,在这种情况下,我将获取attribue @Fecha的值。

代码示例

 File inputFile = new File(file);
 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
 DocumentBuilder dBuilder;
 dBuilder = dbFactory.newDocumentBuilder();                     
 Document doc = dBuilder.parse(inputFile);
 doc.getDocumentElement().normalize();
 XPath xPath =  XPathFactory.newInstance().newXPath();                     
 XPathExpression expr = xPath.compile("Comprobante/@Fecha")
 String names = (String) expr.evaluate(doc, XPathConstants.STRING);

据我所知,XML文件区分大小写,我读过的文件总是@Fecha,大写字母为F,但最近我收到了很多文件{{1除了@fecha的常用文件之外,我无法控制文件的写入方式,所以我需要找到解决这个问题的方法,因为我有代码应用于具有@Fecha

的文件时返回@Fecha

null的文件示例:

@fecha

我可以执行@fecha语句并检查我获得的值是<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/3" fecha="2017-10-25T19:13:19"> </cfdi:Comprobante> ,然后再次检查,但使用if代替empty,如下所示:

@fecha

但我想知道是否有办法使用@Fecha来获取 File inputFile = new File(file); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder; dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); XPath xPath = XPathFactory.newInstance().newXPath(); XPathExpression expr = xPath.compile("Comprobante/@Fecha") String names = (String) expr.evaluate(doc, XPathConstants.STRING); if(names.isEmpty()){ XPathExpression expr = xPath.compile("Comprobante/@fecha") String names = (String) expr.evaluate(doc, XPathConstants.STRING); } 的值,而不管字母Xpath Expression的大小,而不是@Fecha {1}}表达式,我发现我可以使用函数F来完成它,例如:

IF

但我似乎无法使其发挥作用。

1 个答案:

答案 0 :(得分:3)

您的XPath,

translate(@Fecha, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')

@Fecha属性转换为小写。

XPath 1.0

Comprobante/@*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                                       'abcdefghijklmnopqrstuvwxyz')
               = 'fecha']

选择名称Comprobante属性,小写为fecha

或者在 XPath 2.0中更简洁:

Comprobante/@*[lower-case(local-name()) = 'fecha']