2013-04-04 5 views
-2

Quelqu'un pourrait-il me dire comment extraire l'élément Errors du XML ci-dessous en utilisant XPath et C# sous .NET 3.5 Framework?Extraire l'élément du document XML

<?xml version='1.0' encoding='UTF-8'?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<SOAP-ENV:Body> 
<ns1:do_OTA_VehAvailRateRQResponse xmlns:ns1="urn:vanguard-web-webservices-ota-IOTA" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<return xsi:type="xsd:string"><OTA_VehAvailRateRS TimeStamp="2013-04-03T18:16:00" TransactionIdentifier="215997103" SequenceNmbr="1" Target="Production" Version="2.0" xmlns="http://www.opentravel.org/OTA/2003/05"> 
    <Errors> 
    <Error Type="1" Code="999">COMPANY NAME FIELD IS INVALID</Error> 
    </Errors> 
</OTA_VehAvailRateRS> 
</return> 
</ns1:do_OTA_VehAvailRateRQResponse> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+0

Pouvez-vous clarifier le problème que vous avez? Avec la quantité de code que vous avez posté jusqu'à présent, il est très difficile de voir quelle partie vous avez un problème. –

+3

Comment ces terribles questions peuvent-elles être revues à la hausse? Ne tenons-nous pas compte de la F.A.Q. à présent? –

+0

Downvoted la question. Les gens qui ne publient pas leur code défectueux ne méritent certainement pas un upvote. –

Répondre

0

Nous ne pouvons pas dire où vous êtes allé mal si vous ne nous montrez pas votre code.

Mais nous pouvons deviner. Votre élément Errors est dans un espace de nom, et ne pas reconnaître ce fait est une erreur si commune parmi les inexpérimentés que je serais heureux de parier que c'est votre bug.

Pour rechercher des éléments dans un espace de noms, vous avez besoin d'un chemin tel que // e: Erreurs où le préfixe e est lié (au niveau de l'API C#) à l'espace de noms http://www.opentravel.org/OTA/2003/05.

(Désolé, vous ne dites pas que vous êtes inexpérimenté Je déduis cela du fait que si vous étiez expérimenté, vous auriez posté votre code XPath).

+0

En toute déférence, dire aux gens qu'ils sont «inexpérimentés» dans une réponse et réitérer cette affirmation n'est pas quelque chose dont on devrait être fier. Nous sommes tous inexpérimentés - dans un domaine quelconque - dans une certaine mesure. Donc, appeler quelqu'un inexpérimenté ne nous donne même pas une seule nouvelle information. –

+0

Oui, la liaison à un espace de noms était le problème. Ma confusion provenait du fait que l'espace de noms http://www.opentravel.org/OTA/2003/05 n'était pas préfixé dans le XML et donc je ne savais pas quel préfixe utiliser dans le chemin. La solution consistait simplement à créer un préfixe tel que "ota" (pourrais-je l'avoir appelé "WTF"), à lier l'espace de noms et à utiliser le préfixe ota dans le XPAth. – rstuppi

+0

@Dimitre Problème: lorsque les gens ne nous montrent pas leur code, nous devons faire des suppositions, et une partie de la conjecture consiste à deviner leur niveau d'expérience, car cela détermine le type d'erreurs qu'ils sont susceptibles de faire.Donc, je décrivais simplement mon processus de raisonnement, n'impliquant aucune critique. –

0

Utilisation:

//*[name()='Errors'] 

Ceci permet de sélectionner un élément dans le document XML, dont le nom est "erreurs" - quel que soit l'espace de noms de l'élément.

Ou, si vous voulez être plus précis et tenir compte des éléments namespaces exacts sont, vous devez utiliser un objet XmlNamespaceManager et enregistrer une association nécessaire entre le préfixe et l'espace en utilisant son AddNamespace() method.

+0

Cette recommandation est incorrecte car l'expression de chemin dépend des préfixes d'espace de noms utilisés dans la source. Si vous voulez vraiment une requête indépendante de l'espace de noms, utilisez '// * [nom-local() = 'Erreurs']' –

+0

@MichaelKay, Il peut s'agir d'une "mauvaise recommandation" en général, mais dans ce cas, les erreurs recherchées L'élément n'a pas de préfixe et l'expression XPath utilise ce fait. ** Sélectionner un élément quel que soit le préfixe pourrait dans le cas général sélectionner des éléments ayant le même nom local mais appartenant à des espaces de noms différents - * ceci * est une mauvaise recommandation **! En outre, vous n'avez pas lu la réponse à la fin, ou vous auriez vu la recommandation d'une solution exacte en utilisant les espaces de noms enregistrés - avec un lien vers la documentation et l'exemple de code. –

0

Essayez ce code:

XmlDocument xmlDoc = new XmlDocument(); 

xmlDoc .LoadXml(xmlSting); //If u have a xml string, you can create xmlDocument like this, otherwise u can use file name to create xmlDocument. 

String error = .SelectSingleNode("SOAP-ENV:Envelope/SOAP-ENV:Body/return/Errors/Error").Value; 
0
XmlNodeList errorNodes=new XmlDocument().Load("xmlFilePath").GetElementsByTagName("Errors"); 
Questions connexes