2012-09-04 44 views
2

我的.xml結構可能有以下數據:DTD語法 - 允許子元素或PCDATA

<entry id="one-string"> 
      <class>nmWinMultiReports_main</class> 
      <classParams>string</classParams> 
     </entry> 
<entry id="multiple-elements"> 
      <class>nmJavaScript_main</class> 
      <classParams> 
       <pluginid>monitorPlugin</pluginid> 
       <bla>string</bla> 
       <tag>abc</tag> 
      </classParams> 
     </entry> 

如何定義的.dtd文件,以允許classParams要麼1.是一個字符串或者2.多子元素(每一次)?

我想:

<!ELEMENT class (#PCDATA) > 
<!ELEMENT classParams (#PCDATA | pluginid | bla | tag) > 
     <!ELEMENT pluginid (#PCDATA) > 
     <!ELEMENT bla (#PCDATA) > 
     <!ELEMENT tag (#PCDATA) > 

回答

1

我做到了:

<!ELEMENT classParams (#PCDATA | pluginid | bla | tag)* > 
+0

有用。任何想法,爲什麼這一個工程,其他不是?它實際上是在做它看起來像在做什麼? –

2

DTD不能強制你描述的約束;得到類似的東西約束的最簡單的方法是添加一個新的元素(稱之爲string),並宣佈classParams爲採取任何stringpluginid等兒童序列:

<!ELEMENT string (#PCDATA) > 
<!ELEMENT classParams (string 
         | (pluginid, bla, tag)) 
> 

另外,如果

<classParams><string>foo</string></classParams> 

似乎太重了,你可以聲明entry爲採取任何classParamsclassParamString的內容:

<!ELEMENT entry (class, (classParams | classParamString)) > 
<!ELEMENT classParamString (#PCDATA) > 
<!ELEMENT classParams (pluginid, bla, tag) > 
+0

謝謝你的回答。我目前正在使用我的構造,但將來可能會使用您的方法。 – Patrick

0

你也可以通過這種方式實現它:

<!ELEMENT classParams ANY> 
+3

您能否請添加關於您提供的解決方案的更多詳細信息? – abarisone