2012-09-04 41 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