"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية الاستعلام عن XML باستخدام مساحات الأسماء في Java باستخدام XPath؟

كيفية الاستعلام عن XML باستخدام مساحات الأسماء في Java باستخدام XPath؟

تم النشر بتاريخ 2024-11-10
تصفح:274

How to Query XML with Namespaces in Java Using XPath?

استعلام XML مع مساحات الأسماء في Java باستخدام XPath

عند العمل مع مستندات XML التي تحتوي على عناصر مرتبطة بمساحات الأسماء، يمكن أن يصبح الاستعلام باستخدام XPath أمرًا صعبًا. خذ بعين الاعتبار المثال التالي:

سيفشل استخدام تعبير XPath الافتراضي "بدون مساحة اسم" مثل "/workbook/sheets/sheet[1]". وذلك لأن العناصر الموجودة في مستند 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: المطابقة العامة وعامل تصفية المسند

بدلاً من ذلك، يمكن إنشاء تعبير XPath بدون بادئة مساحة الاسم باستخدام تطابق عام للعنصر ومرشح المسند الذي يحدد local-name() وnamespace-uri() المطلوبين:

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