Maison  >  Article  >  Java  >  Comment interroger XML avec des espaces de noms en utilisant XPath en Java ?

Comment interroger XML avec des espaces de noms en utilisant XPath en Java ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-10 06:10:02348parcourir

How to Query XML with Namespaces using XPath in Java?

Interrogation XML avec des espaces de noms à l'aide de XPath en Java

Lorsque vous travaillez avec du XML qui utilise des espaces de noms, les requêtes XPath qui ignorent les espaces de noms peuvent entraîner des correspondances incorrectes. Dans les scénarios où les éléments XML sont liés à un espace de noms spécifique, il devient crucial de prendre en compte l'espace de noms dans les expressions XPath.

Gestion explicite de l'espace de noms

L'approche préférée consiste à déclarer un préfixe d'espace de noms et explicitement référencez-le dans vos requêtes XPath. Cela améliore la lisibilité et la maintenabilité du code. Par exemple :

NamespaceContext namespaceContext = new NamespaceContext();
namespaceContext.addNamespace("x", "http://schemas.example.com/x");
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(namespaceContext);

NodeList nodes = (NodeList)xpath.evaluate("/x:workbook/x:sheets/x:sheet[1]", doc, XPathConstants.NODESET);

Correspondance d'éléments génériques avec des prédicats

Alternativement, il est possible de construire une expression XPath qui correspond de manière générique aux éléments et utilise des prédicats pour filtrer les résultats en fonction de leur nom local et de leur espace de noms. -uri. Bien que cette approche puisse être verbeuse, elle permet plus de flexibilité :

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

Item node = (Item)xpath.evaluate("//*[local-name()='workbook' and namespace-uri()='http://schemas.example.com/x']", doc, XPathConstants.NODE);

Correspondance de nom local

En dernier recours, vous pouvez faire correspondre des éléments en fonction uniquement de leur nom local, en ignorant l'espace de noms. Cependant, cette approche présente le risque de faire correspondre des éléments incorrects dans les scénarios où plusieurs vocabulaires avec des noms locaux similaires sont présents dans le XML :

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

Item node = (Item)xpath.evaluate("//*[local-name()='workbook']", doc, XPathConstants.NODE);

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