Maison > Java > javaDidacticiel > le corps du texte

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

Patricia Arquette
Libérer: 2024-10-24 06:23:01
original
833 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!