0

在我的 .net 代码中,我正在使用第三方 asmx 服务,该服务为我提供 Xml 格式的数据。所以基本上,我收到了一个 XmlNode 形式的结构:

<PostcodeEntry>
    <Postcode>13542</Postcode>
    <Postcodename>Odessa</Postcodename>
</PostcodeEntry>

目前,要将其映射到我的 POCO 对象,我必须手动遍历相应的 ChildNode 并检索它们的 InnerText 值以获取实际数据:

 var PostCodeNode = entryNode.SelectSingleNode("Postcode");
 if (PostCodeNode != null)
 {
      result.PostCode = PostCodeNode.InnerText;
 }

如果我需要映射一个大的信息结构,代码就会变成一个混乱的代码滚动。

有没有办法可以改进这一点,所以我不必手动编写解析?对此的最佳做法是什么?

4

2 回答 2

1

我相信您有不同的选择,具体取决于您获取数据的方式以及您喜欢如何设计代码等。从您的简短描述中,我至少可以想到以下两个:

  • 创建一个 XML 序列化器 - 例如,通过使用 Xml 属性标记您的类并通过序列化器将 XML 直接反序列化为所需的对象。这种方法的缺点是您将在序列化程序和业务对象之间创建强耦合。请看一下这样的内容:http ://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization 。

  • 创建一个代理对象并将您的代理对象映射到您的业务对象。您可以使用 asmx 服务公开的 WSDL 或使用 XSD.exe 工具或类似工具来创建代理对象(如果 XML 尚未由 XSD 描述,您可能需要首先基于 XML 生成 XSD )。然后,您可以将代理对象的属性映射到业务对象的属性。这将为您提供更清晰的对象之间的分离,但同时它需要更多的工作。

兄弟。莫腾

于 2012-11-17T16:08:01.830 回答
0

您可以为 WebService 创建 SoapClient 对象,然后您可以将响应返回为 List<>。您需要将输出响应更改为 List<>。

例如Consilder这个webservice消费, http: //xxx.xx.xxx.xxx/CosmosService/Cm_Service.asmx

然后在您的应用程序中添加服务引用,单击高级按钮,更改集合类型 System.Collections.GenericList。

那么您可以像这样直接将 WebService 方法作为 List<> 使用

CosmosRef.CM_ServiceSoapClient client = new CosmosRef.CM_ServiceSoapClient();

            List<CosmosRef.Product> listProduct = client.GetAllProducts("Computers", 1);
            dataGrid1.DataContext = listProduct;
于 2012-11-29T12:05:24.807 回答