[英]How to properly setup a class structure to properly de-serialize XML?
- 更新 -
實際上,在再次查看代碼之后,我應該改一下這個問題。 在下面添加了更多描述。
我有一個從Web服務返回的XML結構,據說是標准問題cXML結構。 我的問題是重復的<Extrinsic>
節點,它具有一個參數名稱,即除了值之外還可以區分它們。
像這樣:
<ItemDetail>
<UnitPrice>
<Money currency="USD">1.53 </Money>
</UnitPrice>
<Description>ASPIRIN 81 MG CHW 90</Description>
<UnitOfMeasure>EA</UnitOfMeasure>
<Extrinsic name="HCustomerNumber">0100074080</Extrinsic>
<Extrinsic name="HPONumber">201</Extrinsic>
<Extrinsic name="HOrderNumber">4413686057</Extrinsic>
<Extrinsic name="HUserID">ABTGDEV</Extrinsic>
<Extrinsic name="HLegacyCustomerNumber">055150912</Extrinsic>
<Extrinsic name="LegacyItemNumber">198440</Extrinsic>
<Extrinsic name="CustomerMaterialNumber"/>
<Extrinsic name="ContractNumber"/>
<Extrinsic name="NDC">00904628889</Extrinsic>
<Extrinsic name="UPC">309046288893</Extrinsic>
<Extrinsic name="Size">90</Extrinsic>
<Extrinsic name="DrugFormPackSize">90.000</Extrinsic>
<Extrinsic name="Prevent Sub">False</Extrinsic>
<Extrinsic name="SHCCode"/>
<Extrinsic name="DEPTCode"/>
<Extrinsic name="GLCode"/>
<Extrinsic name="SWP">3.62000</Extrinsic>
<Extrinsic name="RetailPrice">0.00</Extrinsic>
<Extrinsic name="RetailPriceOverride">0.00</Extrinsic>
<Extrinsic name="TemporaryRetailPriceOverride">True</Extrinsic>
<Extrinsic name="UDIF"/>
<Extrinsic name="UDIFDesc"/>
<Extrinsic name="Formulary"/>
<Extrinsic name="SPLRouting"/>
</ItemDetail>
如何設置我的類結構,以便可以正確地反序列化? 類本身是由PetaPoco呈現的,因此每個<Extrinsic>
Extrinsic <Extrinsic>
節點都是數據庫中類/字段的屬性。 或者,也許它無法完成,需要手動處理,我對此深信不疑,無法找到一種好的自動方法。
- 更新 -
這就是我要反序列化的類
public int syspohid { get; set; }
public int syspodid { get; set; }
public string pdvendor { get; set; }
public string pdprefix { get; set; }
public Nullable<int> pdnumber { get; set; }
public Nullable<int> pdline { get; set; }
public bool pdtaxable { get; set; }
public bool pdfreightable { get; set; }
public string comments { get; set; }
public string pdlocation { get; set; }
public string pddoctor { get; set; }
public string pdpatient { get; set; }
public string pdlotnum { get; set; }
public Nullable<System.DateTime> pdcasedate { get; set; }
public bool pduseany { get; set; }
public string pdvnitemid { get; set; }
public string pdvnuofm { get; set; }
public Nullable<int> pdvnunit { get; set; }
public string pddescript { get; set; }
public Nullable<decimal> pdvnprice { get; set; }
public Nullable<int> pdvnqty { get; set; }
public Nullable<int> pdrcvtype { get; set; }
public string pdrcvline { get; set; }
public Nullable<int> sysprdid { get; set; }
public Nullable<int> pdvnorgqty { get; set; }
public Nullable<int> sysshipid { get; set; }
public string shipid { get; set; }
public string shipdesc { get; set; }
public string pdgl { get; set; }
public Nullable<System.DateTime> pdshipdt { get; set; }
public string pdinternalid { get; set; }
public string pdmanufacid { get; set; }
public string pdndc { get; set; }
public string pdpatchargeid { get; set; }
public string pdupn { get; set; }
public string entitycode { get; set; }
public string deptcode { get; set; }
public string classcode { get; set; }
public string expencode { get; set; }
public string cadduser { get; set; }
public Nullable<System.DateTime> dadd { get; set; }
public string cedituser { get; set; }
public Nullable<System.DateTime> dedit { get; set; }
public Nullable<decimal> taxpct { get; set; }
public Nullable<int> invoiceqty { get; set; }
public string auditinfo { get; set; }
public string totenumber { get; set; }
public string export { get; set; }
public Nullable<int> scheduledDrugIndex { get; set; }
public string contractid { get; set; }
public string refnum { get; set; }
真正的問題就變成了,如何使用屬性名的值正確反序列化xml。 可能嗎
謝謝。
如果為返回的xml文件定義XML Schema(.xsd)文件,則可以使用XSD.exe命令行工具生成類。
或者,
如果是我,我根本不會反序列化它。 相反,我會用XDocument / XElement對象等解析它。
例如,我會為所有內容手動創建類,並為它們提供更好的功能,例如,
public enum CurrencyType
{
USD = 0,
EUR = 1 //etc..
}
public class Money
{
public CurrencyType CurrenyType { get; set; }
public decimal Value { get; set; }
public Money(XElement element)
{
if (element.Name.LocalName != "Money")
throw new Exception(...);
var aCurrency = element.Attribute("currency");
this.CurrencyType = aCurrency == null || string.IsNullOrEmpty(aCurrency.Value) ? CurrencyType.USD : (CurrencyType)Enum.Parse(typeof(CurrencyType), aCurrency.Value);
this.Value = element != null && !string.IsNullOrEmpty(element.Value) ? element.Value : 0;
}
}
對於每個復雜的子元素,我都會選擇其中之一。 然后,我將創建一個名為ItemDetail的主要對象,該對象將這些類公開為屬性。 在ItemDetail的構造函數中,我將xml加載到Element,獲取money節點,並使用XElement為money節點實例化money類,等等。
我通常會走這條路,因為反序列化會為您的Extrinsic節點提供一個字符串列表或字典,我發現對它進行繁瑣的編碼。 通過自己手動執行此操作,我可以為每個Extrinsic值創建屬性,而不必弄清楚復雜的屬性映射規則即可使解串器執行此操作。 這樣做通常可以帶來更好的代碼(更易於遵循和使用),並且更加靈活。
一種可能性是使用xsd.exe
D:\WorkSpace\dump>xsd myxml.xml
甚至可以使用諸如
http://www.httputility.net/xsd-to-csharp-vb-class.aspx
如果使用正確的xml文件,這將為System.XML.Serialization.XMLSerializer生成易於使用的C#類,以讀寫XML
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.