Maison >Java >javaDidacticiel >Comment gérer les documents XML avec un espace de noms par défaut lors de l'utilisation de 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!