在我的.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;
}
如果我需要映射一个大型信息结构,代码会变得混乱,代码滚动。
有没有办法可以改进这个,所以我不必手动编写解析?这是什么最好的做法?
答案 0 :(得分:1)
我相信您有不同的选择,具体取决于您获取数据的方式以及您希望如何设计代码等。从您的简短描述中我至少可以想到这两个:
创建XML序列化程序 - 例如,通过使用Xml属性标记您的类,并通过序列化程序将XML直接反序列化为您想要的对象。这种方法的缺点是您将在序列化程序和业务对象之间创建强耦合。请看一下这样的内容:http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization。
创建代理对象并将代理对象映射到业务对象。您可以通过使用asmx服务公开的WSDL,或使用XSD.exe工具或类似工具来创建代理对象(如果XSD尚未描述XML,则可能需要首先基于XML生成XSD) )。然后,您可以将代理对象的属性映射到业务对象的属性。这将为您提供更清晰的对象间隔,但同时需要更多的工作。
溴。的Morten
答案 1 :(得分:0)
您可以为WebService创建SoapClient对象,然后您可以将响应返回为List&lt;&gt;。您需要将输出更改为List&lt;&gt;。
示例构建要使用的Web服务,http://xxx.xx.xxx.xxx/CosmosService/Cm_Service.asmx
然后在您的应用程序中添加服务引用,单击“高级按钮”,更改“集合类型System.Collections.GenericList”。
然后您可以将WebService方法用作List&lt;&gt;直接喜欢这个
CosmosRef.CM_ServiceSoapClient client = new CosmosRef.CM_ServiceSoapClient();
List<CosmosRef.Product> listProduct = client.GetAllProducts("Computers", 1);
dataGrid1.DataContext = listProduct;