2010-11-05 23 views
1

Je publie sur une page Web dont on m'a dit qu'elle prenait XML comme corps. Il s'avère que ce qu'il faut vraiment est ce qui ressemble à une URL encodée chaîne de requête CGI:Conversion d'un document XML en chaîne de requête codée URL pour HTTP POST - C#

<FIRST> 
    <ELEMENT1>Value1</ELEMENT1> 
    <ELEMENT2>Value1</ELEMENT2> 
    <ELEMENT3>Value1</ELEMENT3> 
</FIRST> 

<SECOND> 
    <ELEMENT1>Value1</ELEMENT1> 
    <ELEMENT2>Value1</ELEMENT2> 
</SECOND> 

a besoin d'être transmis comme

FIRST_ELEMENT1 = VALUE1 & FIRST_ELEMENT2 = VALUE2 & FIRST_ELEMENT3 = VALUE3 & SECOND_ELEMENT1 = VALUE1 & SECOND_ELEMENT2 = VALEUR2

La troisième partie me dit que c'est un usage courant, bien que je ne l'ai pas vu auparavant (en tant que méthode de soumission XML) il est évident que le service a été conçu pour prendre un POST HTML avec un formulaire comme source de données.

Bien que je puisse voir comment je pourrais écrire une transformation, je me demande s'il existe une méthode dans le framework .Net qui réalise cette traduction. Jusqu'à et y compris. Net 3.5 est disponible sur ce projet.

Merci à l'avance Dave

Répondre

3

J'ai jamais vu que l'utilisation, mais quelque chose comme:

var query = string.Join("&",(
      from parent in XElement.Parse(xml).Elements() 
      from child in parent.Elements() 
      select HttpUtility.UrlEncode(parent.Name.LocalName) + "_" 
       + HttpUtility.UrlEncode(child.Name.LocalName) + "=" 
       + HttpUtility.UrlEncode(child.Value)).ToArray()); 
+0

Solution pure Marc. Le troisième parti est catégorique que c'est «streamed XML» - type de données fantaisie je pense. Encore cela permet d'obtenir la sortie désirée. Merci beaucoup. –

1

Je doute fortement qu'il ya quoi que ce soit intégré pour y parvenir, mais le coder en ça ne devrait pas être dur. J'utiliserais une méthode récursive qui examine les enfants d'un nœud, en s'appelant lui-même avec un préfixe de chaîne qui représente la position du nœud dans l'arbre. Maintenez une liste ou un dictionnaire ou tout ce qui convient le mieux à vos besoins en dehors de la méthode et lorsque vous rencontrez un nœud avec des données texte, ajoutez le préfixe + tag et la valeur à votre liste. Il sera alors trivial de parcourir cette liste et de les joindre au format querystring. Prenez soin d'éviter les esperluettes et autres caractères réservés, cependant.

0

Cela semble assez fou, j'espère que vos données XML ne sont pas très longues ... vous risquez de rencontrer des problèmes si la chaîne de requête dure trop longtemps.

Je ne comprends pas pourquoi vous ne pouvez pas faire un HTTP-POST, réglez le type de contenu sur 'text/xml', et publiez simplement les données XML brutes.

+0

Crois-moi, j'ai essayé ça. La publication réussit mais l'application à l'autre extrémité n'analyse pas XML, elle attend la chaîne de requête. On dirait un système maison, je sais qu'il y a un mainframe au fond, peut-être que ce n'est pas compatible avec XML. –