2010-01-29 5 views
1

i ont le code XML suivant:Quel est le problème avec mon xml?

<messageContent xmlns="http://tempuri.org/" > 
<Message type="MappedMessage" > 
<Properties RequestId="Point-CurveRequest-8326ad44-a1cd-4a96-b4ef-1c4ad213d940" Action="getParCurves" EESId="EESID:NY:20100128:BASE" Currency="USD" Index="INX" /> 
<Body></Body> 
</Message> 
</messageContent> 

puis j'ai cette requête:

var messageType = xmlDoc.SelectSingleNode("/messageContent/Message[@type]"); 

mais peu importe ce que je l'ai essayé, je n'a jamais été en mesure d'obtenir le nœud que je suis à la recherche de. Fondamentalement, je suis juste essayer de voir s'il y a un noeud (nommé "Message") qui a une propriété "type" à l'intérieur de celui-ci.

Quelqu'un a-t-il une idée ici?

Répondre

3

Il n'y a absolument rien de mal avec votre XML - il y a quelque chose de mal avec votre expression XPath, bien :-)

Ajouter un gestionnaire d'espace de noms XML à votre code:

XmlNamespaceManager mgr = new XmlNamespaceManager(xdoc.NameTable); 
mgr.AddNamespace("ns", "http://tempuri.org/"); 

et ensuite utiliser cet espace de noms gestionnaire quand vous faites votre SelectSingleNode:

var messageType = xdoc.SelectSingleNode("/ns:messageContent/ns:Message[@type]", mgr); 

Cela devrait fonctionner.

1

Vous semblez avoir besoin d'établir un contexte d'espace de noms sur votre xpath, ou de vous débarrasser de ce xmlns = "http://tempuri.org/".

+0

Est-ce que cela résiste même si c'est l'espace de nom par défaut pour l'ensemble du document? – prodigitalson

+1

oui, pensé pour être parfaitement sûr que je devrais savoir quel paquet XPath vous utilisez - ou même dans quelle langue vous êtes. – bmargulies

+0

@bmargulies: Intéressant, ce n'est pas le cas lors de l'utilisation de SimpleXml sous PHP - et alors que je ne suis pas Bien sûr, je ne pense pas que cela soit important quand on utilise DOMDcoument ... tant que c'est le ns par défaut pour tout le document. – prodigitalson

-1

Si messageContent est le nœud racine vous devez omettez comme: /Message[@type] ou si vous voulez vérifier toute la hiérarchie du document: //Message[@type]

+0

Je l'ai essayé tous les deux, aucun n'a fonctionné! –

0

pas un avant droit, mais travaillerez

XMLElement messageElement = (XMLElement) xmlDoc.SelectSingleNode("/messageContent/Message"); 
if(messageElement.HasAttribute("type")) 

Mais la chose est si vous avez un nœud Message mais ne contient pas l'attribut de type alors son format non approprié d'un xml.Rather je suggère de vérifier le contenu de l'attribut de type comme ci-dessous

XMLNode messageElement = xmlDoc.SelectSingleNode("/messageContent/Message[@type='MappedMessage']"); 
if(messageElement != null) 
{ 
//Do SOmething 
} 
Questions connexes