【问题标题】:DTD syntax - allow sub element OR pcdataDTD 语法 - 允许子元素或 pcdata
【发布时间】:2012-08-28 23:29:18
【问题描述】:

我的 .xml 结构可能有以下数据:

<entry id="one-string">
            <class>nmWinMultiReports_main</class>
            <classParams>string</classParams>
         </entry>
<entry id="multiple-elements">
            <class>nmJavaScript_main</class>
            <classParams>
               <pluginid>monitorPlugin</pluginid>
               <bla>string</bla>
               <tag>abc</tag>
            </classParams>
         </entry>

如何定义 .dtd 文件以允许 classParams 1. 是字符串或 2. 多个子元素(每个一次)?

我试过了:

<!ELEMENT class ( #PCDATA ) >
<!ELEMENT classParams ( #PCDATA | pluginid | bla | tag ) >
         <!ELEMENT pluginid ( #PCDATA ) >
         <!ELEMENT bla ( #PCDATA ) >
         <!ELEMENT tag ( #PCDATA ) >

【问题讨论】:

    标签: xml dtd pcdata


    【解决方案1】:

    DTD 不能强制执行您描述的约束;获得类似约束的最简单方法是添加一个新元素(称为string)并将classParams 声明为将stringpluginid 等序列作为子元素:

    <!ELEMENT string (#PCDATA) >
    <!ELEMENT classParams (string 
                          | (pluginid, bla, tag))
    >
    

    如果

    <classParams><string>foo</string></classParams> 
    

    似乎太重了,你可以声明entryclassParamsclassParamString 作为内容:

    <!ELEMENT entry (class, (classParams | classParamString)) >
    <!ELEMENT classParamString (#PCDATA) >
    <!ELEMENT classParams (pluginid, bla, tag) >
    

    【讨论】:

    • 感谢您的回答。我目前正在使用我的构造,但将来可能会使用您的方法。
    【解决方案2】:

    我做到了:

    <!ELEMENT classParams ( #PCDATA | pluginid | bla | tag )* >
    

    【讨论】:

    • 有用。知道为什么这个有效而另一个无效吗?它实际上在做它看起来正在做的事情吗?
    【解决方案3】:

    你也可以这样实现:

    <!ELEMENT classParams ANY>
    

    【讨论】:

    • 能否请您添加有关您提供的解决方案的更多详细信息?
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    相关资源
    最近更新 更多