XPath를 사용하여 Java에서 네임스페이스로 XML 쿼리
네임스페이스에 바인딩된 요소가 포함된 XML 문서로 작업할 때 XPath를 사용한 쿼리가 어려울 수 있습니다. 다음 예를 고려하십시오.
"/workbook/sheets/sheet[1]"과 같은 기본 "네임스페이스 없음" XPath 표현식을 사용하면 실패합니다. 이는 XML 문서의 요소가 XPath 표현식에서 고려되지 않는 네임스페이스에 바인딩되어 있기 때문입니다.
해결책 1: 네임스페이스 등록 및 네임스페이스 접두사 사용
권장되는 접근 방식은 네임스페이스 접두사를 사용하여 네임스페이스를 등록하여 XPath를 더 쉽게 읽고 유지 관리하는 것입니다.
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);
네임스페이스 접두사를 사용하면 XPath 표현식은 다음과 같습니다. "/main:workbook/main:sheets/main:sheet[1]" - 지정된 네임스페이스에 바인딩된 요소를 올바르게 처리합니다.
해결책 2: 일반 일치 및 조건자 필터
또는 요소에 대한 일반 일치와 원하는 local-name() 및 네임스페이스-uri()를 지정하는 조건자 필터를 사용하여 네임스페이스 접두사가 없는 XPath 표현식을 구성할 수 있습니다:
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);
이 방법은 장황하며 XML 문서에 혼합된 어휘가 있는 경우 위험을 초래할 수 있습니다.
결론
네임스페이스가 있는 XML 문서를 처리할 때 네임스페이스 바인딩을 고려하는 것이 중요합니다. 접두어로 네임스페이스를 등록하거나 일반 XPath 표현식을 주의 깊게 작성하면 정확하고 안정적인 쿼리를 수행할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3