gpt4 book ai didi

c# - 解析复杂的 WSDL 参数信息

转载 作者:太空狗 更新时间:2023-10-29 20:49:40 25 4
gpt4 key购买 nike

我正在尝试按照给出的示例 here 来解析 WSDL .

作者在评论中指出,该示例无法深入到复杂的数据类型。

事实上,当我运行该示例时,它似乎甚至无法处理简单的数据类型。

我在示例中使用的 System.Web.Services.Description.ServiceDescription 类中四处寻找,但在运行时找不到任何实际参数或返回类型信息。我想我可能需要对 xsd 文件进行一些手动解析?

google 和 stackoverflow 似乎都缺乏如何以编程方式深入了解复杂类型的完整示例,所以......我应该怎么做?

最佳答案

这不是很漂亮 - 但它完成了工作(希望 ;)。我将此代码部分基于您提供的链接,然后添加了一些递归来解析架构中包含的不同类型,以及内部元素及其数据类型。这绝对没有考虑到 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();
}
}
}

关于c# - 解析复杂的 WSDL 参数信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4452724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com