在C#.NET中序列化XML

时间:2016-03-09 14:59:32

标签: c# .net xml

对于Web服务的输出,我有以下场景(输出的类型是字符串,但字符串的内容是XML)。

当服务未成功时,输出为:

<root>
 <exec_id>2053c884-beec-4c33-af64-bce8c4a8601c</exec_id>
 <ERROR_CODE>-13</ERROR_CODE>
 <OUTPUT_XML>Policy GO Period is mistaken (Mar  9 2016  8:43PM, Mar  6 2017         11:59PM)</OUTPUT_XML>
</root>

当服务返回某些内容时,响应为:

<root>
 <exec_id>9a506024-8996-4f17-bcc4-a4616b2c28da</exec_id>
 <ERROR_CODE>0</ERROR_CODE>
 <OUTPUT_XML>
  <root>
   <ProposalNo>000334374</ProposalNo>
   <InsPremium>225.40</InsPremium>
   <InsDuePremium>241.310</InsDuePremium>
   <FeesInfo>
    <Fee>
     <PaymentDate>2016-03-09T16:08:34.613</PaymentDate>
     <FeeSum>241.31</FeeSum>
     <FeeSumCurCode>BGN</FeeSumCurCode>
     <AgencyCode>001</AgencyCode>
   </Fee>
   </FeesInfo>
    <ERROR_MSG>Успешно изпълнена процедура</ERROR_MSG>
  </root>
 </OUTPUT_XML>
</root>

因此,基于此,我创建了一个包含exec_id和ERROR_CODE的基类,因为它们对所有响应都是通用的。现在问题是OUTPUT_XML,因为它每次都是一个不同的对象,所以我为每个服务方法都有一个后继类。问题是服务在OUTPUT_XML中返回错误消息。我的问题是如何以最佳方式处理这个问题?

1 个答案:

答案 0 :(得分:0)

您的服务是否受您控制? (不确定这是否是一个约束。) 在上述两种情况下,没有任何属性允许对XML进行开箱即用的反序列化。你可以编写一些自定义序列化,但这样就太过分了。

如果服务是你的,那么你可以定义一个响应类并序列化它。如果你可以序列化它,那么你可以反序列化它。然后在您的响应XML中,输出的元素是错误消息的元素,而不是一个可能包含任何元素的元素。 XML的内容应该更具可预测性。这就是我们使用模式的原因。但是使用类来序列化和反序列化可以完成同样的事情。 XML是可预测的。

您还可以获取<OUTPUT_XML>节点的InnerXml属性,如果它以<root>开头,则反序列化该字符串是一个单独的XML文档。这是合乎逻辑的,因为这是他们实际给你的东西 - 一个XML文档作为XML文档中的字符串。

或者,正如所说的,如果错误代码是可靠的指标,那么你可以先读取它。