2013-04-15 44 views
1

我目前有一個C#類,它是從XML模式生成的,用於獲取XML文件並更新數據庫中的值。如何使用XSD生成的C#類序列化/反序列化XML的單個元素

如果我堅持是需要被存儲在數據庫中作爲獨立的XML,我會那麼需要在運行時反序列化這些值(由於複雜性和多變性)之一。

是否有可能定義第二個C#類來處理這一個元素而不會干擾主類。

或者當它被重新保存以保存時,更改這個節點的名稱會簡單嗎?

編輯:我對缺乏語境表示歉意,已經很晚了,而且我正在出門。 XML文件用於爲不同的客戶端設置網頁表單驗證和定製,至少80%的模式是非常簡單的數據(使字段強制性,應用正則表達式,隱藏和顯示字段是一些示例)

我提到的複雜部分與多個字段之間的條件驗證有關。這裏的XML是什麼樣子的樣本:

<?xml version="1.0"?> 

<Relationships> 
    <Relationship xsi:type="MutuallyExclusiveRelationship"> 
     <Fields> 
      <Field Id="lineItemAfeNumber" IsInGrid="true"/> 
      <Field Id="lineItemCostCenter" IsInGrid="true"/> 
     </Fields> 
    </Relationship>  
</Relationships> 

<Fields> 

    <Field xsi:type="TextField" Id="invoiceNumber"> 
     <ValidationRegex Value="^[0-9a-zA-Z\-]*$"/> 
     <ValidationRegexMessage Value="{0} must be alpha-numeric and can contain dashes."/> 
     <MaxLength Value="20"/> 
    </Field> 

    <Field xsi:type="TextField" Id="afeNumber"> 
     <InputMask Value="aa999999"/> 
     <ValidationRegex Value="^[A-Za-z]{2}[0-9]{6}$"/> 
     <ValidationRegexMessage Value="{0} must be in the format AA999999."/> 
    </Field> 

    <Field xsi:type="TextField" Id="costCenter"> 
     <ValidationRegex Value="^[a-zA-Z0-9]*$"/> 
     <ValidationRegexMessage Value="{0} must be alpha-numeric."/> 
     <MinLength Value="8"/> 
     <MaxLength Value="9"/> 
    </Field> 


    <Field xsi:type="TextField" Id="orderNumber"> 
     <MinLength Value="1"/> 
     <MaxLength Value="12"/> 
    </Field> 

    <Field xsi:type="TextField" Id="generalLedgerCode"> 
     <InputMask Value="9999.999"/> 
     <ValidationRegex Value="^[0-9]{4}\.[0-9]{3}$"/> 
     <ValidationRegexMessage Value="{0} must be in the format 0000.000."/> 
    </Field> 

    <Field xsi:type="TextField" Id="approverId"> 
     <Label Value="Approver Code"/> 
     <MaxLength Value="10"/> 
    </Field> 

    <Field xsi:type="TextField" Id="leaseWell"> 
     <Label Value="Location/UWI"/> 
    </Field> 

    <Field xsi:type="TextField" Id="poNumber"> 
     <ValidationRegex Value="^[a-zA-Z0-9/-]*$"/> 
     <ValidationRegexMessage Value="{0} must be alpha-numeric and can contain '-'."/> 
     <MaxLength Value="12"/> 
    </Field> 

    <Field xsi:type="DropDownField" Id="currency"> 
     <Label Value="Currency"/> 
     <DefaultValue Value="CAD"/> 
     <Values> 
      <DropDownValue Value="USD"/> 
      <DropDownValue Value="CAD"/> 
     </Values> 
    </Field>  

    <Field xsi:type="TextField" Id="remitToTax"> 
     <Label Value="GST/HST #"/> 
    </Field> 

    <Field xsi:type="TextField" Id="detailsComment"> 
     <Mandatory Value="false"/> 
     <MaxLength Value="40"/> 
    </Field>  

    <Field xsi:type="TextField" Id="newComment"> 
     <MaxLength Value="40"/> 
    </Field> 

    <!-- Attachments --> 
    <Field xsi:type="TextField" Id="attachmentFileName"> 
     <MandatoryMessage Value="Attachments are required."/> 
    </Field> 

    <Field xsi:type="DropDownField" Id="approverCompanyCode"> 
     <Mandatory Value="true"/> 
    </Field> 

    <Field xsi:type="TextField" Id="recipientName"> 
     <Mandatory Value="true"/> 
    </Field>   
</Fields> 

<Grids> 
    <Grid Id="invoiceDetailsTable"> 
     <Fields> 
      <Field xsi:type="TextField" Id="lineItemDescription"> 
       <MaxLength Value="40"/> 
      </Field>     

      <Field xsi:type="TextField" Id="lineItemAfeNumber"> 
       <InputMask Value="aa999999"/> 
       <ValidationRegex Value="^[A-Za-z]{2}[0-9]{6}$"/> 
       <ValidationRegexMessage Value="{0} must be in the format AA999999."/> 
      </Field> 

      <Field xsi:type="TextField" Id="lineItemCostCenter"> 
       <ValidationRegex Value="^[a-zA-Z0-9]*$"/> 
       <ValidationRegexMessage Value="{0} must be alpha-numeric."/> 
       <MinLength Value="8"/> 
       <MaxLength Value="9"/> 
      </Field> 

      <Field xsi:type="TextField" Id="lineItemOrderNumber"> 
       <MinLength Value="1"/> 
       <MaxLength Value="12"/> 
      </Field> 

      <Field xsi:type="TextField" Id="lineItemLeaseWell"> 
       <Label Value="Location/UWI"/> 
       <Mandatory Value="true"/> 
      </Field> 

      <Field xsi:type="TextField" Id="lineItemGlAccount"> 
       <InputMask Value="9999.999"/> 
       <ValidationRegex Value="^[0-9]{4}\.[0-9]{3}$"/> 
       <ValidationRegexMessage Value="{0} must be in the format 0000.000."/> 
      </Field> 


      <Field xsi:type="TextField" Id="lineItemPoNumber"> 
       <ValidationRegex Value="^[a-zA-Z0-9/-]*$"/> 
       <ValidationRegexMessage Value="{0} must be alpha-numeric and can contain '-'."/> 
       <MaxLength Value="12"/> 
      </Field> 
     </Fields> 
    </Grid> 
</Grids> 

這裏的關係,部分是我想有reserialized的一部分,這顯然是一個簡單的例子該部分可能是什麼,還有更多的未顯示的子元素。

+0

缺乏上下文和代碼示例不作任何回答更容易,你知道這個問題嗎? – LightStriker

回答

0

經過一番深入調查和頭腦風暴,我們已經確定了兩個不同的序列化類實際上生活在不同的範圍,其消除,我也陷入了衝突。

0

當您將主類保存到數據庫時,爲什麼不序列化這個複雜的元素? 例如,如果你的類是這樣的:

public class Master 
{ 
    public string simple; 
    public Complex complex; 
} 

可以在DB的複雜元素保存爲XML有:

void SaveToDB(Stream file) 
{ 
    XmlSerializer masterSerializer = new XmlSerializer(typeof(Master)); 
    Master m = (Master)masterSerializer.Deserialize(file); 
    //save m.simple to db 
    XmlSerializer complexSerializer = new XmlSerializer(typeof(Complex)); 
    StringWriter complexXmlWriter = new StringWriter(); 
    complexSerializer.Serialize(complexXmlWriter, m.complex); 
    string complexXml = complexXmlWriter.ToString(); 
    //save complexXml to db 
} 

這樣,你不需要改變你的大師班,你可以將複雜元素保存在xml中。