2 votes

Accepter les données SOAP en tant que XML brut

J'essaie d'écrire un .NET IIS à l'aide du service web System.ServiceModel l'espace de noms. Mon service doit lire le fichier startTag à partir du paquet entrant en tant que XML RAW plutôt qu'en tant que nœud désérialisé. .NET mais je n'arrive pas à le faire. Voici un exemple SOAP paquet :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:tmk="http://schemas.datacontract.org/2004/07/TMK.Catalog">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:Catalog>
         <tem:document>
            <tmk:CHRMAS03>
                 <startTag>
                <myTag>
                    <answer>Hello world!</answer>
                </myTag>
            </startTag>
            </tmk:CHRMAS03>
         </tem:document>
      </tem:Catalog>
   </soapenv:Body>
</soapenv:Envelope>

Et voici mon service web :

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Xml.XPath;

[ServiceContract]
public interface IContract
{
    [OperationContract]
    string Catalog(Point document);
}

[DataContract]
public class Point
{
    [DataMember]
    public XPathDocument CHRMAS03;

    public Point (XPathDocument document)
    {
        this.CHRMAS03= document;
    }
}
public class Service1 : IContract
{
    public string Catalog (Point document)
    {
        if(document.CHRMAS03!=null) 
        {
        try
        {
            XPathNavigator navigator = document.CHRMAS03.CreateNavigator();
            XPathNodeIterator iterator1 =  navigator.Select("startTag/myTag/answer");
            if(iterator1==null) {return "crash"; }
            int a = iterator1.Count; // Exception!
            return "success"; 
        }
            catch(Exception e)
            {
                return e.Message + e.StackTrace;
            }
        }
        return "fail";
    }

Lorsque j'envoie le paquet spécifié ci-dessus à mon service web, cette ligne :

int a = iterator1.Count

lance une exception :

   Object reference not set to an instance of an object.
   at MS.Internal.Xml.Cache.XPathDocumentNavigator.get_NameTable()
   at MS.Internal.Xml.Cache.XPathDocumentElementChildIterator..ctor(XPathDocumentNavigator parent, String name, String namespaceURI)
   at MS.Internal.Xml.Cache.XPathDocumentNavigator.SelectChildren(String name, String namespaceURI)
   at MS.Internal.Xml.XPath.ChildrenQuery.Advance()
   at MS.Internal.Xml.XPath.ChildrenQuery.Advance()
   at MS.Internal.Xml.XPath.ChildrenQuery.Advance()
   at MS.Internal.Xml.XPath.Query.MoveNext()
   at MS.Internal.Xml.XPath.Query.get_Count()
   at TMK.Catalog.Service1.Catalog(Point document)

Comment redéfinir le CHRMAS03 afin qu'il prenne le contenu XML brut du champ startTag en tant que chaîne de caractères que je peux analyser manuellement ou en tant qu'instance de travail de n'importe quelle norme. .NET classe de lecture XML , tels que XmlReader o XmlNode ?

1voto

Ching Chang Points 23

"startTeg/myTeg/answer" devrait être "startTag/myTag/answer" ?

0voto

Mon XPath demande :

startTag/myTag/answer

n'a pas fonctionné parce que le XML est analysé avec des éléments d'espacement entre les balises. Je suis passé à XMLDocument et j'ai modifié mon code pour les ignorer :

XmlNode root = doc.DocumentElement;
foreach (XmlNode idoc in root.ChildNodes)
{
    if (idoc.Name == "#whitespace") continue;
    /* ... processing ... */
}

Je pense que ces éléments d'espacement ont causé XPathNodeIterator.Count à lancer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X