Rumah > Java > javaTutorial > teks badan

Bagaimana untuk Menyoal XML dengan Ruang Nama dalam Java Menggunakan XPath?

Susan Sarandon
Lepaskan: 2024-11-17 08:27:03
asal
781 orang telah melayarinya

How to Query XML with Namespaces in Java Using XPath?

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>
Salin selepas log masuk

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);
Salin selepas log masuk

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);
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan