2011-08-01 60 views
0

我有以下xml具有xsd架構,但是很差,無法用於序列化。爲以下xml創建xsd模式

<rulestruct> 
    <rule> 
     <type name="vector" /> 
     <ruleident ruleidentifier="" /> 
     <pattern type="" /> 
    </rule> 
    <rule> 
      <type name="expression" /> 
      <ruleident ruleidentifier="" /> 
      <pattern type="" /> 
    </rule> 
    <rule> 
      <type name="vector" /> 
      <ruleident ruleidentifier="" /> 
      <pattern type="" /> 
    </rule> 
    <rule> 
      <type name="statement" /> 
      <ruleident ruleidentifier="" /> 
      <pattern type="" /> 
    </rule> 
    <rule> 
      <type name="statement" /> 
      <ruleident ruleidentifier="" /> 
      <pattern type="" /> 
    </rule> 
</rulestruct> 

每個規則結構可以有1.N規則。每個規則都可以重複。訂單必須預先保存。每個規則有1.N個元素,有些有9個元素,其他有10個,13個。有9種不同的規則類型。

我正在考慮使用元素組來表示每個規則類型,但我不太確定如何映射它。

+0

目前還不清楚你在這裏要求什麼。你的意思是你需要幫助序列化一個類到XML,或者你想爲你的類創建一個更好的模式嗎? –

回答

2

如果您想保留元素(規則)的各種規則類型的相同的名字,你定義抽象元素(屬性abstract="true")及其所有的孩子將具有xs:ComplextContent>xs:extension,其中base屬性等於您的抽象類型名稱。 在您的XML中,每個規則元素必須具有xsi:type attrite以區分元素具體類型。 說明和示例是here

如果您希望/可以爲每種規則類型使用不同的元素名稱,則可以使用替換組。你的共同祖先再次被屬性抽象定義。具體類型定義爲屬性substitutionGroup等於共同祖先名稱的xs:元素。 說明和示例是here

+0

你能舉個例子嗎。 –

+0

找到了這個,http://www.xfront.com/VariableContentContainers.html,它反映了你所描述的內容。我認爲方法3似乎與我所尋找的最接近,這是您的第一種方法。謝謝。鮑勃 –

+0

得到它的工作。謝謝。短髮 –

0

您使用jaxb?使用xsd你可以使用繼承,如果需要元素,你可以使用minOccurs/maxOccurs。

這裏一個例子,我從頭開始寫沒有測試它,也許有錯誤:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
      jaxb:extensionBindingPrefixes="xjc"> 
  
      <xsd:annotation> 
            <xsd:appinfo> 
                  <jaxb:globalBindings> 
                        <xjc:simple /> 
                  </jaxb:globalBindings> 
            </xsd:appinfo> 
      </xsd:annotation> 
  
      <xsd:element name="rulestruct" type="PRuleStruct" /> 
      <xsd:complexType name="PRuleStruct"> 
            <xsd:sequence> 
                  <xsd:element name="rule" type="PRule" minOccurs="1" maxOccurs="unbounded" /> 
            </xsd:sequence> 
       </xsd:complexType> 
  
      <xsd:complexType name="PRule"> 
            <xsd:sequence> 
                  <xsd:element name="vector" type="PVector" minOccurs="1" maxOccurs="unbounded" /> 
            </xsd:sequence> 
       </xsd:complexType> 

您已經看到有您的問題往往是許多解決方案。我的選擇通常是使用繼承和更少的標記,並使用名稱。我的目的:

<rules> 
<ruleVector ruleidentifier="sample" patternType="sample"> 
</ruleVector> 

+0

對不起,我從來沒有把.net,c#monikers標籤放進去。 –