2011-10-08 4 views
0

OK, je suis confus. Je ne vois pas pourquoi cela ne fonctionne pas.XmlDocument et ReadNode

Vu:

XmlReader reader = ...; //created by calling routine. 
XmlDocument tmpDoc = new XmlDocument(); 
XmlNode a = tmpDoc.ReadNode(reader); 
tmpDoc.AppendChild(a); 
var t1 = tmpDoc.GetElementsByTagName("Entity")[0]; 
XmlNode mainNode = tmpDoc.SelectSingleNode("//Entity"); 

L'appel à getElementByTagName œuvres, mais l'appel à SelectSingleNode ne fonctionne pas. Il renvoie null. J'ai essayé d'autres formes de sélection de nœuds et elles ne fonctionnent pas.
Par le débogueur Je sais que le InnerXml est correct et contient quelque chose comme

<Entity> 
    <aaa /> 
</Entity> 

aussi: si je l'utilise sur le même XML dans un fichier.

XmlDocument eDoc = new XmlDocument(); 
eDoc.Load(fileName); 
XmlNode eNode = eDoc.SelectSingleNode("/Entity"); 

Cela fonctionne.

Des idées.

Merci d'avance.

Jim K

+0

Cela ne fait probablement pas de différence, mais dans un échantillon vous avez // Entité et dans l'autre/Entité. –

+0

J'ai essayé toutes les combinaisons. Aucun n'a travaillé. –

+0

Lorsque j'essaie de comprendre les expressions XPath, j'utilise un outil gratuit téléchargeable ici: http://www.bubasoft.net/xpathbuilder/Xpathbuilder2.aspx (XPath Builder). –

Répondre

0

Les problèmes concernent les espaces de noms. En raison de l'utilisation du lecteur, il ajoute un espace de noms.

La réponse est la même que XmlDocument single select. J'ai testé cela et ça marche maintenant.

0

J'ai essayé ce code:

String xmlString = 
    @"<Entity> 
     <aaa /> 
    </Entity>"; 

using (XmlReader reader = XmlReader.Create(new StringReader(xmlString))) 
{ 
    XmlDocument tmpDoc = new XmlDocument(); 
    XmlNode a = tmpDoc.ReadNode(reader); 
    tmpDoc.AppendChild(a); 
    var t1 = tmpDoc.GetElementsByTagName("Entity")[0]; 
    XmlNode mainNode = tmpDoc.SelectSingleNode("//Entity"); 
} 

Et cela fonctionne aussi bien pour GetElementsByTagName et SelectSingleNode. Donc, je suppose que votre XML est invalide. Peut-être que vous pourriez poster le XML qui reproduisent le problème?

+0

Si le XML était invalide, il lancerait une exception et ne fonctionnerait pas de manière incohérente. – svick

+0

Je sais aussi que le XML est valide. Je suis dans le processus d'ajouter des fonctionnalités supplémentaires et si je l'utilise et ne passe pas par cette étape d'ajout, le XML fonctionne bien. –

+0

Je viens de vérifier que le code ci-dessus fait la même chose, donc peut-être un bug dans le travail dans le cadre. La seule différence est la source du XML et le fait que j'ai le traitement en utilisant le lecteur avant cet appel et j'extraire une sous-partie de XML pour un traitement spécial. Je vais écrire un sous-exemple qui est plus proche de la façon dont je l'utilise. –