Maison > Java > javaDidacticiel > Quand utiliser XPath sur des documents XML avec un espace de noms par défaut ?

Quand utiliser XPath sur des documents XML avec un espace de noms par défaut ?

Mary-Kate Olsen
Libérer: 2024-10-24 06:57:42
original
1020 Les gens l'ont consulté

When to Use XPath on XML Documents with a Default Namespace?

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

Lors de la manipulation de documents XML avec un espace de noms par défaut et sans préfixe, il est possible d'utiliser XPath sans l'URI de l'espace de noms, comme si aucun espace de noms n'existait. Cependant, définir la propriété namespaceAware de DocumentBuilderFactory sur false peut ne pas toujours suffire.

Pour utiliser XPath avec succès sur de tels documents, vous pouvez utiliser un NamespaceContext lors de l'exécution de XPath. Cela implique de préfixer les fragments XPath pour qu'ils correspondent au NamespaceContext. Les préfixes utilisés n'ont pas besoin d'être alignés avec ceux du document.

Voici une version mise à jour de votre code qui intègre 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>
Copier après la connexion

Notez que l'expression XPath a également été corrigée , selon la suggestion de Dennis.

Alternativement, l'extrait de code simplifié suivant peut également fonctionner :

<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

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