我期待着DTD,即xml文件中的每个元素都是可选的,但如果有多个元素,必须按正确的顺序排列。而且必须至少有一个元素,不能重复。
在这种情况下,至少有一个
<!DOCTYPE mnop [
<!ELEMENT abcd (#PCDATA)>
<!ELEMENT efgh (#PCDATA)>
<!ELEMENT ijkl (#PCDATA)>
<!ELEMENT mnop (abcd?, efgh?, ijkl?)>
]>
<mnop>
</mnop>
在这种情况下,可以有重复的
<!DOCTYPE mnop [
<!ELEMENT abcd (#PCDATA)>
<!ELEMENT efgh (#PCDATA)>
<!ELEMENT ijkl (#PCDATA)>
<!ELEMENT mnop (abcd?, efgh?, ijkl?)+>
]>
<mnop>
<abcd>AAAAAAA</abcd>
<abcd>AAAAAAA</abcd>
</mnop>
在这种情况下(我不知道为什么!),但在xml中可以是不正确的顺序(DTD有效)。
<!DOCTYPE mnop [
<!ELEMENT abcd (#PCDATA)>
<!ELEMENT efgh (#PCDATA)>
<!ELEMENT ijkl (#PCDATA)>
<!ELEMENT mnop ((abcd, efgh?, ijkl?) | (abcd?, efgh, ijkl?) | (abcd?, efgh?, ijkl))>
]>
<mnop>
<efgh>EEEEE</efgh>
<abcd>AAAAAAA</abcd>
<ijkl>AAAAAAA</ijkl>
</mnop>
例如:正确的文件。
<mnop>
<abcd>AAAAAAA</abcd>
</mnop>
<mnop>
<efgh>EEEEE</efgh>
<ijkl>AAAAAAA</ijkl>
</mnop>
<mnop>
<ijkl>AAAAAAA</ijkl>
</mnop>
在我的例子中,我说的是3个元素,但在我的例子中,我有12个元素。
非常简单
<!ELEMENT mnop ((a, ((b, c?) | c)?) | (b, c?) | c)? >
-----------------------------------^ all optional
(----------------) (-----) (-) starting with a/b/c
recursive
请注意,这是一个生成工具,用java或python或这样的语言编写的.当然是12个元素。
从外到内的可选性。(x, (...)?)
如果能有其他的选择就更好了
Java的。
void p(StringBuilder sb, List<String> tags) {
if (tags.isEmpty()) {
throw new IllegalStateException();
}
int n = tags.size();
if (n == 1) {
sb.append(tags.get(0));
return;
}
sb.append('(');
for (int starti = 0; starti < n; ++starti) {
if (starti != 0) {
sb.append(" | ");
}
if (n - starti > 1) {
sb.append('(');
}
sb.append(tags.get(starti));
if (n - starti > 1) {
sb.append(", ");
p(sb, tags.subList(starti + 1, n));
sb.append("?)");
}
}
sb.append(')');
}
StringBuilder all = new StringBuilder();
p(all, Arrays.asList("a", "b", "c"));
all.append('?');
System.out.println(all);
((a, ((b, c? ))