2010-11-27 4 views
0

Je reçois l'exception que NodeType "None" n'est pas pris en charge lors de la tentative d'exécution du code suivant.C# XmlNodeReader exception NodeType non pris en charge

public int ObjectContentI(string XmlPath) 
{ 
    XmlNodeReader xnr = new XmlNodeReader(this.xmlr.SelectSingleNode(XmlPath)); 
    return xnr.ReadElementContentAsInt(); 
} 

this.xmlr est un XmlDocument avec un document chargé avec succès dans celui-ci. XmlPath contient une URL XPath valide.

Comment définir le NodeType (xnr.NodeType est en lecture seule) ou est-ce que je fais autre chose de mal?

Une partie de mon XML:

<?xml version="1.0" encoding="utf-8" ?> 
<ship weapons="0"> 
    <cost> 
    <metal>250</metal> 
    <crystal>100</crystal> 
    </cost> 
    <health> 
    <shields>750</shields> 
    <sregene>10</sregene> 
    <hitpoints>1000</hitpoints> 
    <oxygen cps="2">25000</oxygen> 
    </health> 

Mon XPath: "/ navire/santé/bouclier/texte()"

+0

Bien que ce ne soit pas une réponse, j'aimerais recommander que si votre solution le permet, je vous recommande fortement de regarder LINQ to XML. Il supprime à peu près tous les points de douleur lorsque vous travaillez avec Xml. NET –

+0

La définition de NodeType n'a pas de sens car cela impliquerait de modifier le XML sous-jacent (et c'est un * lecteur *, pas un écrivain). Je suppose que l'exception survient parce que vous essayez de lire la valeur d'un nœud qui n'a pas de texte interne (auto-fermé?), Bien que je ne sois pas sûr à 100% – Cameron

+0

Pouvez-vous poster la chaîne XPath, parce que l'erreur vous obtiennent des moyens que vous renvoyez un XmlNodeType de None, ce qui est probablement dû au fait que XPath n'est pas correct. Publiez également une partie du XML pour le rendre plus facile à comprendre le bon XPath –

Répondre

1

Eh bien, votre approche est correcte mais pas complètement.

Supposons que

XmlNode n = myXMLDoc.SelectSingleNode("/ship/health/shields/"); 

n.InnerXML OU n.InnerText devrait vous donner ce que vous avez besoin.

+0

Merci beaucoup! :) –

+0

@Cobra_Fast: content que je puisse aider. :) –

0

conqenator Bien que vous a fourni un code qui fixe votre problème suivant est le raisonnement pourquoi il ne fonctionne pas en premier lieu:

Si vous n'appelez pas la méthode Read sur un XmlNodeReader ou l'une des classes dériver de XmlReader, vous obtiendrez toujours un NodeType XmlNodeType.None, qui est la raison de l'erreur. Pour corriger le code que vous avez fourni et pour obtenir un entier de retour c'est ce que le code doit ressembler à:

public int ObjectContentI(string XmlPath) 
{ 
    int result; 
    using(XmlNodeReader xnr = new XmlNodeReader(this.xmlr.SelectSingleNode(XmlPath))){ 
     while(xnr.Read()){ 
      result = xnr.ReadElementContentAsInt(); 
     } 
    } 
    return result; 
} 

Notez que le XPath pour obtenir ce wroking doit changer pour /ship/health/shields depuis ReadElementContentAsInt() renvoie le contenu de l'élément et ne fonctionnera pas sur un nœud de texte, ce que vous obtenez lorsque vous utilisez /ship/health/shields/text().

Notez que j'ai également enveloppé le XmlNodeReader dans un bloc using, ce qui permettra de disposer du XmlNodeReader une fois que vous avez terminé avec lui pour libérer des ressources.

Questions connexes