我正在阅读一些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
但我似乎无法使其发挥作用。
答案 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']