que quiero hacer una consulta XPath en este archivo (extracto presentados):Java XPath: Las consultas con xmlns espacio de nombres predeterminado
<?xml version="1.0" encoding="UTF-8"?>
<!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST -->
<ModelClass xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.ModelClass:2.0">
<ModelClass.Parent>
<Core.Reference package="com.test.mypackage" name="ModelName" type="Model"/>
Este es un fragmento de código que estoy usando:
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document document = builder.parse(new File(testFile));
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new NamespaceContext() {
public String getNamespaceURI(String prefix) {
...
String result = xpath.evaluate(xpathQueryString, document);
System.out.println(result);
El problema al que me enfrento es que cuando se hace referencia al espacio de nombre predeterminado en una consulta XPath, no se llama al método getNamespaceURI para resolverlo. Esta consulta, por ejemplo, no extrae nada:
//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package
Ahora he intentado "engañar" al analizador mediante la sustitución de xmlns
con un prefijo falso d
y luego escribir el método getNamespaceURI
en consecuencia (por lo que volver http://xml.sap.com/2002/10/metamodel/webdynpro
cuando se encuentra d
). En este caso, se llama al getNamespaceURI
pero el resultado de la evaluación de la expresión XPath siempre es una cadena vacía.
Si elimino los espacios de nombres del archivo y de la expresión de consulta XPath, puedo obtener la cadena que quería (com.test.mypackage).
¿Hay alguna manera de hacer que las cosas funcionen correctamente con el espacio de nombres predeterminado?
Hola Martin, lo he intentado pero no funciona ... –
Asegúrate también de crear un espacio de nombres compatible DocumentBuilder http://docs.oracle.com/javase/6/docs/api/javax/ xml/parsers/DocumentBuilderFactory.html # setNamespaceAware% 28boolean% 29 antes de trabajar con espacios de nombres. –
Eso hizo el truco. Pensé que el DocumentBuilder estaba consciente de los espacios de nombres por defecto. Gracias de nuevo. –