2 votes

Xpath retournant NULL pour une expression Xpath valide

J'utilise une requête Xpath assez simple (ci-dessous) pour interroger une colonne de la base de données SQL Server 2008 dont les valeurs suivent toutes la forme de l'exemple (ci-dessous). Ma requête renvoie NULL pour toutes les lignes, plutôt que les valeurs de l'élément example (par exemple, "VALUE"), même si l'attribut example est défini pour chaque ligne que j'interroge.

J'ai essayé de déclarer le xsd y xsi dans mon expression Xquery, et en choisissant parmi plusieurs noms d'attributs différents, mais ni l'un ni l'autre n'a eu d'effet. Que me manque-t-il ?

Requête :

select ColumnName.value('(/RootNode/@example)[1]', 'nvarchar(15)') [Result]
  from TableName

Exemple de nœud XML (le XML réel contient beaucoup plus d'attributs, que j'ai omis) :

<RootNode xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://intranet"
          example="VALUE">
  <IsValid>true</IsValid>
</RootNode>

Tentative de requête en utilisant les espaces de noms, avec le même résultat. :

select ColumnName.value('
declare namespace xsd="http://www.w3.org/2001/XMLSchema";
declare namespace xsi="http://www.w3.org/2001/XMLSchema-instance";

(/RootNode/@example)[1]', 'nvarchar(15)') [Result]
  from TableName

4voto

Sten Petrov Points 3916

Vous devez ajouter l'espace de noms par défaut pour vos données xml et très probablement modifier la requête xpath.

Je ne l'ai pas testé, mais c'est ma meilleure estimation et cela devrait vous aider :

WITH XMLNAMESPACES (N'http://intranet' as intra)
SELECT ColumnName.value('/intra:RootNode[@example]/intra:IsValid[1]', 'nvarchar(15)') [Result]
FROM TableName

4voto

Dov Points 3001

Cette requête fonctionne. Le problème est que les nœuds de données déclarent un espace de noms par défaut personnalisé.

select ColumnName.value('
declare default element namespace "http://intranet";

(/RootNode/@example)[1]', 'nvarchar(15)') [Result]
  from TableName

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X