Consultar XML con espacios de nombres en Java usando XPath
Cuando se trabaja con documentos XML que contienen elementos vinculados a espacios de nombres, realizar consultas con XPath puede resultar un desafío. Considere el siguiente ejemplo:
El uso de una expresión XPath predeterminada "sin espacio de nombres" como "/workbook/sheets/sheet[1]" fallará. Esto se debe a que los elementos del documento XML están vinculados a un espacio de nombres, que no se considera en la expresión XPath.
Solución 1: registrar el espacio de nombres y utilizar el prefijo del espacio de nombres
El enfoque recomendado es registrar el espacio de nombres con un prefijo de espacio de nombres, lo que hace que XPath sea más fácil de leer y mantener:
NamespaceContext namespaceContext = new NamespaceContext() { @Override public String getNamespaceURI(String prefix) { if (prefix.equals("main")) { return "http://schemas.openxmlformats.org/spreadsheetml/2006/main"; } else if (prefix.equals("r")) { return "http://schemas.openxmlformats.org/officeDocument/2006/relationships"; } return null; } }; XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); xPath.setNamespaceContext(namespaceContext); NodeList nodes = (NodeList) xPath.evaluate("/main:workbook/main:sheets/main:sheet[1]", document, XPathConstants.NODESET);
Usando el prefijo del espacio de nombres, la expresión XPath se convierte en "/main:workbook/main:sheets/main:sheet[1]", que aborda correctamente los elementos vinculados al espacio de nombres especificado.
Solución 2: coincidencia genérica y filtro de predicado
Como alternativa, se puede construir una expresión XPath sin un prefijo de espacio de nombres utilizando una coincidencia genérica para el elemento y un filtro de predicado que especifique el nombre local() y el uri de espacio de nombres() deseados:
XPathFactory xPathFactory = XPathFactory.newInstance(); XPath xPath = xPathFactory.newXPath(); NodeList nodes = (NodeList) xPath.evaluate("/*[local-name()='workbook' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']" "/*[local-name()='sheets' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main']" "/*[local-name()='sheet' and namespace-uri()='http://schemas.openxmlformats.org/spreadsheetml/2006/main'][1]", document, XPathConstants.NODESET);
Este método es detallado y puede presentar riesgos si hay vocabularios mixtos en el documento XML.
Conclusión
Cuando se trata de documentos XML con espacios de nombres, es esencial considerar los enlaces de espacios de nombres. Al registrar el espacio de nombres con un prefijo o crear cuidadosamente expresiones XPath genéricas, se pueden realizar consultas precisas y confiables.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3