簡體   English   中英

如何正確設置類結構以正確地反序列化XML?

[英]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命令行工具生成類。

鏈接到XSD工具

或者,

如果是我,我根本不會反序列化它。 相反,我會用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM