动态XML的参数DTD?

时间:2015-12-06 08:07:50

标签: xml dtd xml-dtd

也许这是XML和DTD大师的一些任务?希望你能帮助我摆脱困境。

我的XML文件需要此DTD实体

  <!-- testing -->
  &test-commonTestingLibs;

或者

  <!-- testing -->
  &compile-commonTestingLibs;

我的DTD for对于 test - *

来说是这样的
<!ENTITY test-commonTestingLibs "
  <dependency org='org.dbunit' name='dbunit' rev='${lib.version.dbunit}' conf='test->default, sources, javadoc' />

  <dependency org='org.testng' name='testng' rev='${lib.version.testng}' conf='test->default, sources, javadoc' />
" >

编译 - *

<!ENTITY compile-commonTestingLibs "
  <dependency org='org.dbunit' name='dbunit' rev='${lib.version.dbunit}' conf='compile->default, sources, javadoc' />

  <dependency org='org.testng' name='testng' rev='${lib.version.testng}' conf='compile->default, sources, javadoc' />
" >

是否可以定义一个DTD,使相同的代码更可重复使用参数&#34; aParameter &#34;?

<!ENTITY commonTestingLibs-%%aParameter%% "
  <dependency org='org.dbunit' name='dbunit' rev='${lib.version.dbunit}' conf='%%aParameter%%->default, sources, javadoc' />

  <dependency org='org.testng' name='testng' rev='${lib.version.testng}' conf='%%aParameter%%->default, sources, javadoc' />
" >

所以我可以使用DTD中的aParameter或作为参数的XML进行实体定义?

这将有助于我消除多余的定义,这些定义通常不会像上面的例子那么短,差别只是一个简单的关键字&#34; aParameter &#34; (主要是:编译,测试,提供......)

1 个答案:

答案 0 :(得分:0)

是的,您可以使用parameter entity来引用更改的小部分。它与您的建议非常相似,但您没有尝试更改实体名称,而是拥有一个通用实体,只有内部数据会发生变化。

<!-- Change this to "compile" when needed. -->
<!ENTITY % type "test">

<!-- Make this entity generic, so you don't have to change which reference you're using. -->
<!ENTITY commonTestingLibs "
  <dependency org='org.dbunit' name='dbunit' rev='${lib.version.dbunit}' conf='%type;->default, sources, javadoc' />
  <dependency org='org.testng' name='testng' rev='${lib.version.testng}' conf='%type;->default, sources, javadoc' />
">

我要做的是使用conditional (IGNORE/INCLUDE) sections更容易从“测试”切换到“编译”。通过这种方式,您可以将所有特定于该类型的声明放在一个位置,然后在某种意义上将它们关闭然后再打开。

这样可以更容易扩展,因为要更改类型,您只需要在DTD中更改一个位置。

在下面的示例中,<![%test;[ ... ]]>内的任何内容都将被包含在内,<![%compile;[ ... ]]>内的任何内容都将被忽略...

<!ENTITY % test "INCLUDE">
<!ENTITY % compile "IGNORE">

<![%test;[ 
<!ENTITY % type "test">
<!-- Any other "test" specific declarations. -->
]]>

<![%compile;[ 
<!ENTITY % type "compile">
<!-- Any other "compile" specific declarations. -->
]]>

<!ENTITY commonTestingLibs "
  <dependency org='org.dbunit' name='dbunit' rev='${lib.version.dbunit}' conf='%type;->default, sources, javadoc' />
  <dependency org='org.testng' name='testng' rev='${lib.version.testng}' conf='%type;->default, sources, javadoc' />
">

要忽略“test”并包含“compile”,您只需要更改两个实体:

<!ENTITY % test "IGNORE">
<!ENTITY % compile "INCLUDE">