Soal XML dengan Ruang Nama dalam Java Menggunakan XPath
Apabila bekerja dengan dokumen XML yang mengandungi elemen terikat pada ruang nama, pertanyaan dengan XPath boleh menjadi mencabar. Pertimbangkan contoh berikut:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> <sheets> <sheet name="Sheet1" sheetId="1" r:id="rId1"/> </sheets> </workbook>
Menggunakan ungkapan lalai "tiada ruang nama" XPath seperti "/buku kerja/helaian/helaian[1]" akan gagal. Ini kerana elemen dalam dokumen XML terikat pada ruang nama, yang tidak dipertimbangkan dalam ungkapan XPath.
Penyelesaian 1: Daftar Ruang Nama dan Gunakan Awalan Ruang Nama
Pendekatan yang disyorkan ialah mendaftarkan ruang nama dengan awalan ruang nama, menjadikan XPath lebih mudah dibaca dan maintain:
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);
Menggunakan awalan ruang nama, ungkapan XPath menjadi "/main:workbook/main:sheets/main:sheet[1]", yang menangani elemen terikat pada ruang nama yang ditentukan dengan betul.
Penyelesaian 2: Padanan dan Predikat Generik Penapis
Sebagai alternatif, ungkapan XPath tanpa awalan ruang nama boleh dibina dengan menggunakan padanan generik untuk elemen dan penapis predikat yang menentukan local-name() dan namespace-uri() yang dikehendaki:
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);
Kaedah ini bertele-tele dan boleh menimbulkan risiko jika perbendaharaan kata bercampur terdapat dalam XML dokumen.
Kesimpulan
Apabila berurusan dengan dokumen XML dengan ruang nama, adalah penting untuk mempertimbangkan pengikatan ruang nama. Dengan mendaftarkan ruang nama dengan awalan atau mencipta ungkapan XPath generik dengan teliti, pertanyaan yang tepat dan boleh dipercayai boleh dilakukan.
Atas ialah kandungan terperinci Bagaimana untuk Menyoal XML dengan Ruang Nama dalam Java Menggunakan XPath?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!