2009-07-08 6 views
2

Je travaille sur le format de document Open XML pour les feuilles Excel.Pourquoi l'expression XPath ne renvoie aucun résultat en C# mais en dehors de C#?

var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]"); 

il doit retourner toutes les lignes avec des formules, mais il ne retourne rien. Le même xml dans Oxygen Editor, lorsqu'il est appliqué à la même expression xpath, les renvoie tous.

Je suis en train de copier WorksheetXml inner xml pour m'assurer que le contenu est le même ... savez-vous pourquoi C# ne fonctionne pas comme prévu?


EDIT: numéro Namespace

J'ai mis ceci:

var manager = new XmlNamespaceManager(WorksheetXml.NameTable); 
manager.AddNamespace(string.Empty, @"http://schemas.openxmlformats.org/spreadsheetml/2006/main"); 
manager.AddNamespace("r", @"http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 

var nodeList = WorksheetXml.SelectNodes(@"//c[child::f]", manager); 

et ça n'a pas marché, je pense que ce n'est pas un problème d'espace de noms.

+0

btw, "// c [f]" serait plus simple ;-p –

Répondre

3

Est-il possible que l'éditeur Oxygen gère les espaces de noms différemment? Je suppose que l'élément c se trouve dans un espace de noms, mais vous n'en spécifiez aucun.

Voir this very similar question pour l'exemple de code - et si ce n'est pas le problème, veuillez poster plus de détails.

EDIT: Le code que vous avez publié n'utilise toujours pas d'espace de noms dans XPath. Essayez ceci:

var manager = new XmlNamespaceManager(WorksheetXml.NameTable); 
manager.AddNamespace("n", 
    "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); 
manager.AddNamespace("r", 
    "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 

var nodeList = WorksheetXml.SelectNodes("//n:c[child::n:f]", manager); 

(je ne sais pas quel espace les c et f éléments sont destinés à être - ajuster correctement.)

(Notez qu'il n'y a pas besoin d'utiliser une chaîne mot pour mot littéral quand vous n'avez pas d'antislash et la chaîne est sur une ligne.)

+0

c l'élément provient de l'espace de noms par défaut. J'ai ajouté un namespacemgr et il ne renvoie toujours rien =/ –

+0

Et quel est l'espace de noms par défaut ici? Je suis sûr que vous ne voulez pas dire l'espace de noms vide. Voulez-vous dire principal ou des relations? Voir ma modification. –

+0

J'ai résolu ce problème sans XPath, car il ne fonctionnait pas et j'ai dû livrer le code la semaine dernière. Création de ce 'n' -même si dans le XML c'est l'espace de nom "vide", et c est juste ... - et la manipulation c comme n: c aiderait? –

0

Vous n'avez pas spécifié d'espace de noms OpenXML pour les nœuds dans votre expression XPath. Toutes les API .NET XPath stock que je connais n'héritent d'aucun espace de noms du contexte de document - donc si vous ne le spécifiez pas explicitement, et n'utilisez aucun préfixe dans l'expression XPath, il est traité comme un espace de noms vide.

En supposant qu'il s'agit d'un appel à XmlNode.SelectNode, vous avez besoin de la surcharge de 2 arguments où le deuxième argument est XmlNamespaceManager.

+0

J'ai changé l'appelant, en passant le gestionnaire en paramètre, et cela ne fonctionne toujours pas =/ –

+1

Cela ne fonctionne pas car dans XPath, un élément sans préfixe est _always_ dans l'espace de nom vide (ie sans URI) , indépendamment de ce que vous faites dans XmlNamespaceManager. Voir http: //www.w3.org/TR/xpath # tests de nœuds: Un QName dans le test de nœud est développé en un nom étendu en utilisant les déclarations d'espace de noms du contexte d'expression. ... l'espace de noms par défaut déclaré avec xmlns n'est pas utilisé: si le QName n'a pas de préfixe, alors l'URI de l'espace de nommage est nul (c'est de la même manière que les noms d'attributs sont développés). Vous devez utiliser un préfixe dans votre XPath pour que cela fonctionne. –

Questions connexes