Maison  >  Article  >  Java  >  Comment gérer les documents XML avec un espace de noms par défaut lors de l'utilisation de XPath ?

Comment gérer les documents XML avec un espace de noms par défaut lors de l'utilisation de XPath ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-24 06:23:01833parcourir

How to Handle XML Documents with Default Namespace When Using XPath?

Utilisation de XPath sur des documents XML avec un espace de noms par défaut

Lorsque vous traitez des documents XML qui utilisent un espace de noms par défaut, l'absence de préfixe peut rendre Manipulation XPath difficile. Bien que définir la propriété namespaceAware sur false puisse sembler une solution, cela a ses limites.

Pour manipuler efficacement de tels documents, il faut prendre en compte les éléments suivants :

Utiliser un contexte d'espace de noms

Lorsque vous travaillez avec des documents qualifiés par un espace de noms, un NamespaceContext peut être utilisé lors de l'évaluation XPath. Ce contexte vous permet de spécifier des préfixes pour les URI d'espace de noms. Bien que les préfixes utilisés dans le contexte ne correspondent pas nécessairement à ceux du document, les fragments du XPath doivent être préfixés en conséquence.

Par exemple, considérons le code suivant :

<code class="java">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>

Remarque : L'expression XPath "/ns:root/ns:author" utilise des préfixes cohérents avec le NamespaceContext.

Approche alternative

Dans certains cas, l'approche suivante pourrait également être efficace :

<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>

Remarque : Cette approche suppose que l'espace de noms par défaut n'est pas utilisé ailleurs dans le document.

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