XML的帮助下即时读取一些Xpath文件并使用一些预定义的路径提取一些值

路径如下所示:

Comprobante/@Fecha


例如,上面的路径将用于提取属性@Fecha,该文件如下所示:

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


这是用于获取数据的代码示例,在这种情况下,我将获取属性@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,但是最近我收到了很多带有@fecha而不是@Fecha的文件。到@Fecha的普通文件,我现在无法控制文件的写入方式,因此我需要找到解决此问题的方法,因为当我将代码应用于具有null >

带有@fecha的文件示例:

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


我可以执行@fecha语句,并检查Im得到的值是否为if,然后再次使用empty而不是@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);
 }


但是我想知道是否有一种方法可以使用@Fecha来获取Xpath Expression的值,而不管字母@Fecha的大小如何,而不是F表达式,我发现我可以使用功能IF进行操作,例如:

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


但我似乎无法使其正常工作。

最佳答案

您的XPath,

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


@Fecha属性值转换为小写。

这个XPath 1.0,

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


选择名称为Comprobantefecha属性。

或更简明地在XPath 2.0中:

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

10-06 05:52