XML,DTD:如何使订单不重要

Jas*_*ers 16 xml dtd

我开始使用XML文件和解析器作为存储数据的便捷方式

我想使用DTD来检查xml文件到达时的结构.

这是我的DTD文件

< ?xml version="1.0" encoding="UTF-8"?>
< !ELEMENT document (level*)>
< !ELEMENT level (file,filelName?,fileNumber?)>
< !ELEMENT file (#PCDATA)>
< !ELEMENT filelName (#PCDATA)>
< !ELEMENT fileNumber (#PCDATA)>
Run Code Online (Sandbox Code Playgroud)

(请注意,fileName和fileNumber实际上是纯可选的)

<document>
 <level>
  <file>group1file01</file>
 </level>
 <level>
  <file>group1file02</file>
  <fileName>file 2</fileName>
  <fileNumber>0</fileNumber>
 </level>
...
Run Code Online (Sandbox Code Playgroud)

所以这一切都很好.(我现在使用eclipse"validate"选项来测试它)

然而,在测试时我得到了我认为是一个奇怪的错误

如果我做

 <level>
  <levelName>Level 2</levelName>
  <levelNumber>0</levelNumber>
        <file>group1level02</file>
 </level>
Run Code Online (Sandbox Code Playgroud)

更改行的顺序,Eclipse拒绝验证它...

我想知道这是否是Eclipse的问题,或者订单是否真的很重要.

如果订单很重要,我怎样才能更改DTD以使其无论元素的排序如何都能正常工作?

我无法真正改变XML,因为我已经编写了所有的XML文件和解析器(我知道我的方法是错误的)

Gai*_*aim 9

正如Roger所说,只有有序列表,但您可以使用运算符OR |来定义所有可接受的组合

<!ELEMENT level ((file,filelName?,fileNumber?)|(filelName?,fileNumber?,file))>
Run Code Online (Sandbox Code Playgroud)

这里,选择部分有一个例子

  • 这不是有效的DTD,因为它不是确定性的.即使它是有效的,也不会以任何可能的顺序允许子元素. (4认同)

jas*_*sso 8

在DTD中声明具有出现约束的无序列表通常会导致长或复杂的声明.这样做的一个重要原因是DTD必须是确定性的,因此即使切换到XML Schema也不一定有帮助.

这是元素的DTD声明<level>,包含:

  • 正好是1个<file>元素
  • 0-1个<fileName>元素
  • 0-1个<fileNumber>元素
  • 以任何可能的顺序

码:

<!ELEMENT level ( (file, ((fileName, fileNumber?) | (fileNumber, fileName?))?)
                 |(fileName, ((file, fileNumber?) | (fileNumber, file)))
                 |(fileNumber, ((file, fileName?) | (fileName, file))) )>
Run Code Online (Sandbox Code Playgroud)


ren*_*don 6

ANY如果您不太关心有效性,可以使用关键字:

<!ELEMENT level ANY>
Run Code Online (Sandbox Code Playgroud)

我在这里遇到了类似的问题,这两种情况可能会出现:

<Instructors>
  <Lecturer>
  </Lecturer>
  <Professor>
  </Professor>
</Instructors>

<Instructors>
  <Lecturer>
  </Lecturer>
  <Professor>
  </Professor>
</Instructors>
Run Code Online (Sandbox Code Playgroud)

我找到的唯一解决方案是:

<!ELEMENT Instructors ANY>
Run Code Online (Sandbox Code Playgroud)

也许有更好的解决方案,但它适用于我的特定问题.

  • 最好使用:<!ELEMENT Instructors(Lecturer | Professor)*> (7认同)