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.
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);
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);
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!