我开始使用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文件和解析器(我知道我的方法是错误的)
正如Roger所说,只有有序列表,但您可以使用运算符OR |来定义所有可接受的组合
<!ELEMENT level ((file,filelName?,fileNumber?)|(filelName?,fileNumber?,file))>
Run Code Online (Sandbox Code Playgroud)
看这里,选择部分有一个例子
在DTD中声明具有出现约束的无序列表通常会导致长或复杂的声明.这样做的一个重要原因是DTD必须是确定性的,因此即使切换到XML Schema也不一定有帮助.
这是元素的DTD声明<level>,包含:
<file>元素<fileName>元素<fileNumber>元素码:
<!ELEMENT level ( (file, ((fileName, fileNumber?) | (fileNumber, fileName?))?)
|(fileName, ((file, fileNumber?) | (fileNumber, file)))
|(fileNumber, ((file, fileName?) | (fileName, file))) )>
Run Code Online (Sandbox Code Playgroud)
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)
也许有更好的解决方案,但它适用于我的特定问题.