Parse Complex WSDL Параметр Информация - PullRequest
6 голосов
/ 15 декабря 2010

Я пытаюсь проанализировать WSDL, в соответствии с приведенным примером здесь .

Автор отмечает, что в комментариях этот пример не способен углубляться в сложныетипы данных.

И на самом деле, когда я запускаю пример, он, кажется, даже не обрабатывает простые типы данных.

Я ковырялся в System.Web.Services.Description.ServiceDescriptionкласс, который используется в примере, но не может найти какой-либо фактический параметр или информацию о типе возвращаемого значения во время выполнения.Я понимаю, что мне может потребоваться выполнить ручной анализ файла xsd?

Как в google, так и в stackoverflow, по-видимому, не хватает полного примера того, как можно детально анализировать сложные типы, так что ... как мне это сделатьэто?

Ответы [ 2 ]

19 голосов
/ 22 декабря 2010

Это не красиво - но оно выполняет свою работу (надеюсь;).Я основал этот код частично на предоставленной вами ссылке, а затем добавил некоторую рекурсию для анализа различных типов, включенных в схему, а также внутренних элементов и их типов данных.Это определенно не учитывает все возможности в XML-схеме, но я думаю, что это достаточно иллюстрирует, что вы можете добавить к этому сложность, если это необходимо.

Надеюсь, это поможет !!!!

internal class Program
{
    private static void Main(string[] args)
    {
        //Build the URL request string
        UriBuilder uriBuilder = new UriBuilder(@"http://digicomdev:8888/digitalOrderBroker/digitalOrderBroker.asmx");
        uriBuilder.Query = "WSDL";

        HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(uriBuilder.Uri);
        webRequest.ContentType = "text/xml;charset=\"utf-8\"";
        webRequest.Method = "GET";
        webRequest.Accept = "text/xml";

        //Submit a web request to get the web service's WSDL
        ServiceDescription serviceDescription;
        using (WebResponse response = webRequest.GetResponse())
        {
            using (Stream stream = response.GetResponseStream())
            {
                serviceDescription = ServiceDescription.Read(stream);
            }
        }

        //Loop through the port types in the service description and list all of the 
        //web service's operations and each operations input/output
        foreach (PortType portType in serviceDescription.PortTypes)
        {
            foreach (Operation operation in portType.Operations)
            {
                Console.Out.WriteLine(operation.Name);

                foreach (var message in operation.Messages)
                {
                    if (message is OperationInput)
                        Console.Out.WriteLine("Input Message: {0}", ((OperationInput) message).Message.Name);
                    if (message is OperationOutput)
                        Console.Out.WriteLine("Output Message: {0}", ((OperationOutput) message).Message.Name);

                    foreach (Message messagePart in serviceDescription.Messages)
                    {
                        if (messagePart.Name != ((OperationMessage) message).Message.Name) continue;

                        foreach (MessagePart part in messagePart.Parts)
                        {
                            Console.Out.WriteLine(part.Name);
                        }
                    }
                }
                Console.Out.WriteLine();
            }
        } //End listing of types

        //Drill down into the WSDL's complex types to list out the individual schema elements 
        //and their data types
        Types types = serviceDescription.Types;
        XmlSchema xmlSchema = types.Schemas[0];

        foreach (object item in xmlSchema.Items)
        {
            XmlSchemaElement schemaElement = item as XmlSchemaElement;
            XmlSchemaComplexType complexType = item as XmlSchemaComplexType;

            if (schemaElement != null)
            {
                Console.Out.WriteLine("Schema Element: {0}", schemaElement.Name);

                XmlSchemaType schemaType = schemaElement.SchemaType;
                XmlSchemaComplexType schemaComplexType = schemaType as XmlSchemaComplexType;

                if (schemaComplexType != null)
                {
                    XmlSchemaParticle particle = schemaComplexType.Particle;
                    XmlSchemaSequence sequence =
                        particle as XmlSchemaSequence;
                    if (sequence != null)
                    {
                        foreach (XmlSchemaElement childElement in sequence.Items)
                        {
                            Console.Out.WriteLine("    Element/Type: {0}:{1}", childElement.Name,
                                                  childElement.SchemaTypeName.Name);
                        }
                    }
                }
            }
            else if (complexType != null)
            {
                Console.Out.WriteLine("Complex Type: {0}", complexType.Name);
                OutputElements(complexType.Particle);
            }
            Console.Out.WriteLine();
        }

        Console.Out.WriteLine();
        Console.In.ReadLine();
    }

    private static void OutputElements(XmlSchemaParticle particle)
    {
        XmlSchemaSequence sequence = particle as XmlSchemaSequence;
        XmlSchemaChoice choice = particle as XmlSchemaChoice;
        XmlSchemaAll all = particle as XmlSchemaAll;

        if (sequence != null)
        {
            Console.Out.WriteLine("  Sequence");

            for (int i = 0; i < sequence.Items.Count; i++)
            {
                XmlSchemaElement childElement = sequence.Items[i] as XmlSchemaElement;
                XmlSchemaSequence innerSequence = sequence.Items[i] as XmlSchemaSequence;
                XmlSchemaChoice innerChoice = sequence.Items[i] as XmlSchemaChoice;
                XmlSchemaAll innerAll = sequence.Items[i] as XmlSchemaAll;

                if (childElement != null)
                {
                    Console.Out.WriteLine("    Element/Type: {0}:{1}", childElement.Name,
                                          childElement.SchemaTypeName.Name);                        
                }
                else OutputElements(sequence.Items[i] as XmlSchemaParticle);
            }
        }
        else if (choice != null)
        {
            Console.Out.WriteLine("  Choice");
            for (int i = 0; i < choice.Items.Count; i++)
            {
                XmlSchemaElement childElement = choice.Items[i] as XmlSchemaElement;
                XmlSchemaSequence innerSequence = choice.Items[i] as XmlSchemaSequence;
                XmlSchemaChoice innerChoice = choice.Items[i] as XmlSchemaChoice;
                XmlSchemaAll innerAll = choice.Items[i] as XmlSchemaAll;

                if (childElement != null)
                {
                    Console.Out.WriteLine("    Element/Type: {0}:{1}", childElement.Name,
                                          childElement.SchemaTypeName.Name);
                }
                else OutputElements(choice.Items[i] as XmlSchemaParticle);
            }

            Console.Out.WriteLine();
        }
        else if (all != null)
        {
            Console.Out.WriteLine("  All");
            for (int i = 0; i < all.Items.Count; i++)
            {
                XmlSchemaElement childElement = all.Items[i] as XmlSchemaElement;
                XmlSchemaSequence innerSequence = all.Items[i] as XmlSchemaSequence;
                XmlSchemaChoice innerChoice = all.Items[i] as XmlSchemaChoice;
                XmlSchemaAll innerAll = all.Items[i] as XmlSchemaAll;

                if (childElement != null)
                {
                    Console.Out.WriteLine("    Element/Type: {0}:{1}", childElement.Name,
                                          childElement.SchemaTypeName.Name);
                }
                else OutputElements(all.Items[i] as XmlSchemaParticle);
            }
            Console.Out.WriteLine();
        }
    }
}
1 голос
/ 16 декабря 2010

Что вы хотите сделать с проанализированным результатом?Например, вы можете использовать ServiceDescription.Read и импортер для компиляции сборки, если вы хотите получить типы в память для их использования.

Пример такого подхода можно увидеть в этом сценарии powershell:1003 *

http://www.leeholmes.com/blog/2007/02/28/calling-a-webservice-from-powershell/

...