Maison  >  Article  >  Java  >  Comment traiter des documents XML avec des espaces de noms par défaut dans XPath à l'aide de Java

Comment traiter des documents XML avec des espaces de noms par défaut dans XPath à l'aide de Java

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-24 06:17:01755parcourir

How to Process XML Documents with Default Namespaces in XPath using Java

Traitement XPath des documents avec des espaces de noms par défaut

Le traitement XPath des documents XML utilisant des espaces de noms par défaut (ceux sans préfixes) suit les mêmes principes que ceux utilisé pour les documents avec des préfixes définis.

NamespaceContext et conventions de préfixes

Pour les documents utilisant des espaces de noms qualifiés, un NamespaceContext peut être implémenté lors de l'évaluation XPath. Cela permet aux fragments XPath d'être préfixés selon les exigences de NamespaceContext. Notamment, les préfixes utilisés n'ont pas besoin d'être conformes à ceux utilisés dans le document original.

Implémentation du code

Vous trouverez ci-dessous un exemple d'implémentation de code de cette approche :

<code class="java">import java.util.Iterator;
import javax.xml.namespace.NamespaceContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Demo {

    public static void main(String[] args) {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true);
        try {
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document dDoc = builder.parse("E:/test.xml");

            XPath xPath = XPathFactory.newInstance().newXPath();
            xPath.setNamespaceContext(new MyNamespaceContext());
            NodeList nl = (NodeList) xPath.evaluate("/ns:root/ns:author", dDoc, XPathConstants.NODESET);
            System.out.println(nl.getLength());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static class MyNamespaceContext implements NamespaceContext {

        public String getNamespaceURI(String prefix) {
            if("ns".equals(prefix)) {
                return "http://www.mydomain.com/schema";
            }
            return null;
        }

        public String getPrefix(String namespaceURI) {
            return null;
        }

        public Iterator getPrefixes(String namespaceURI) {
            return null;
        }

    }

}</code>

Approche alternative

De plus, l'extrait de code suivant fournit une approche alternative qui est plus proche de la requête d'origine mais qui tient toujours compte de l'espace de noms par défaut :

<code class="java">import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Demo {

    public static void main(String[] args) {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document dDoc = builder.parse("E:/test.xml");

            XPath xPath = XPathFactory.newInstance().newXPath();
            NodeList nl = (NodeList) xPath.evaluate("/root/author", dDoc, XPathConstants.NODESET);
            System.out.println(nl.getLength());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn