c)?)

问题描述 投票:0回答:1

我期待着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个元素。

xml dtd
1个回答
0
投票

非常简单

<!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? ))

© www.soinside.com 2019 - 2024. All rights reserved.