Document XML SelectSingleNode retourne null
Je suis en train de lire les données XML à partir de lecteur de flux et je suis également à obtenir une réponse XML. Mais lorsque je tente de lire ses noeuds, il est toujours retourner null.
var request = (HttpWebRequest) WebRequest.Create(address);
var response = (HttpWebResponse) request.GetResponse();
var stream = response.GetResponseStream();
if(stream != null)
{
var xmlReader = new XmlTextReader(stream);
var xmlDocument = new XmlDocument();
xmlDocument.Load(xmlReader);
var node = xmlDocument.SelectSingleNode("RateQuote");
}
Document XML
<RateQuoteResponse xmlns="http://ratequote.usfnet.usfc.com/v2/x1">
<STATUS>
<CODE>0</CODE>
<VIEW>SECURED</VIEW>
<VERSION>...</VERSION>
</STATUS>
<RateQuote>
<ORIGIN>
<NAME>KNOXVILLE</NAME>
<CARRIER>USF Holland, Inc</CARRIER>
<ADDRESS>5409 N NATIONAL DR</ADDRESS>
<CITY>KNOXVILLE</CITY>
<STATE>TN</STATE>
<ZIP>37914</ZIP>
<PHONE>8664655263</PHONE>
<PHONE_TOLLFREE>8006545963</PHONE_TOLLFREE>
<FAX>8656379999</FAX>
</ORIGIN>
<DESTINATION>
<NAME>KNOXVILLE</NAME>
<CARRIER>USF Holland, Inc</CARRIER>
<ADDRESS>5409 N NATIONAL DR</ADDRESS>
<CITY>KNOXVILLE</CITY>
<STATE>TN</STATE>
<ZIP>37914</ZIP>
<PHONE>8664655263</PHONE>
<PHONE_TOLLFREE>8006545963</PHONE_TOLLFREE>
<FAX>8656379999</FAX>
</DESTINATION>
<ORIGIN_ZIP>37914</ORIGIN_ZIP>
<DESTINATION_ZIP>37909</DESTINATION_ZIP>
<TOTAL_COST>99.24</TOTAL_COST>
<SERVICEDAYS>1</SERVICEDAYS>
<INDUSTRYDAYS>1.6</INDUSTRYDAYS>
<CLASSWEIGHT>
<CLASS>55</CLASS>
<ASCLASS>50</ASCLASS>
<WEIGHT>100</WEIGHT>
<CHARGES>0.0</CHARGES>
</CLASSWEIGHT>
</RateQuote>
</RateQuoteResponse>
OriginalL'auteur | 2013-06-18
Vous devez vous connecter pour publier un commentaire.
Le document XML utilise l'espace de noms par défaut "http://ratequote.usfnet.usfc.com/v2/x1". Vous avez besoin de changer la
SelectSingleNode
appel à l'utilisation de cet espace de noms.Vous devez configurer un namspace gestionnaire et de la fournir à
SelectSingleNode
.MODIFIER
Le
RateQuoteResponse
élément dispose d'un espace de noms par défautxmlns="..."
. Cela signifie que tous les éléments d'utiliser cet espace de noms aussi, à moins d'être spécifiquement remplacée.var node = xmlDocument.SelectSingleNode("//rate:RateQuote/TOTAL_COST", nsmgr);
Pourquoi cela ne fonctionne pas? Il est de nouveau jeternull
Vous avez le même problème à nouveau - la
TOTAL_COST
élément est dans cet espace de noms. (Je suis en train de modifier ma réponse à le mentionner.)Merci. Je me demande parfois si les gens qui ont développé ces Api ont jamais réellement essayé de les utiliser!
Ou... tout simplement oublier toutes ces merde espaces de noms et d'utiliser XPath à la place 🙂
xmlDocument.SelectSingleNode(String.Format("//*[local-name()='{0}']", nodeName));
OriginalL'auteur Richard Schneider
Vous pouvez supprimer l'espace de noms lors de la lecture du fichier, il suffit de désactiver les espaces de noms du XmlTextReader:
Après que vous ne devez pas vous soucier de l'espace de noms lors de l'utilisation de XPath /LINQ sur votre XML-éléments.
Merci. Résolu. Upvoted.
OriginalL'auteur Florian D.
Le problème, c'est que vous demandez un
RateQuote
élément sans un espace de noms, alors que l'RateQuote
élément est fait dans l'espace de noms avec l'URIhttp://ratequote.usfnet.usfc.com/v2/x1
.Vous pouvez soit utiliser un
XmlNamespaceManager
à l'adresse de l'espace de noms au sein de votre XPath, ou de l'utilisation de LINQ to XML, ce qui est très simple espace de noms de la manipulation:Personnellement, je utiliser LINQ to XML si vous pouvez peut-être - je le trouve beaucoup plus agréable à utiliser que
XmlDocument
. Vous pouvez toujours utiliser XPath si vous le souhaitez bien sûr, mais personnellement, je préfère utiliser l'interrogation de méthodes.EDIT: Notez que l'espace de noms défaut s'applique à l'enfant des éléments de trop. Afin de trouver le
TOTAL_COST
élément que vous auriez besoin:LINQ
exemple de code pour sélectionnerRateQuote
nœud ?C'est le code que j'ai publié - le
rateQuote
variable se réfère à la<RateQuote>
élément.ok merci....
Merci, document xml ne parvient pas à charger et c'est jeter de l'erreur comme
No root element found
en lignevar document = XDocument.Load(stream);
Bien qui suggère que vous avez déjà consommé le flux. Êtes-vous essayer de le faire après aussi chargement dans un XmlDocument?
OriginalL'auteur Jon Skeet
Vous pouvez définir espaces de noms à faux dans le XmlTextReader.
Donc, dans votre code, changement:
à
Avec cette modification, vous devriez être en mesure d'obtenir le nœud que vous voulez avec SelectSingleNode, sans avoir à utiliser des espaces de noms.
OriginalL'auteur Filipe Camizao Lage
Vous devez également être en mesure de le faire:
La syntaxe VB pour ce qui est:
OriginalL'auteur mormegil