在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']
选择名称为
Comprobante
的fecha
属性。或更简明地在XPath 2.0中:
Comprobante/@*[lower-case(local-name()) = 'fecha']