【问题标题】:Can I modify/restrict the ATTLIST of an XML DTD to allow for UNIQUE attributes?我可以修改/限制 XML DTD 的 ATTLIST 以允许 UNIQUE 属性吗?
【发布时间】:2013-05-29 16:04:58
【问题描述】:

我不知道我的问题是否被正确提出。我有一个包含 DTD 的 XML 文档。我已经定义了 ATTLIST,如果我多次使用相同的属性,我想限制或修改 XML 验证将引发错误或失败的 DTD。 我的 XML 文档如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!-- DTD START -->
<!DOCTYPE dtype
[
    <!ELEMENT   dtype   (ea?, eb?, ec, ed?) >
    <!ELEMENT   ea      (data+)             >
    <!ELEMENT   eb      (ee+)               >
    <!ELEMENT   ec      (data+)             >
    <!ELEMENT   ed      (data+)             >
    <!ELEMENT   ee      (data+)             >
    <!ELEMENT   data    (#PCDATA)           >

    <!ATTLIST   ee
                    ef      CDATA   #REQUIRED
    >
    <!ATTLIST   data
                    element CDATA   #REQUIRED
                    value   CDATA   #IMPLIED
                    unit    CDATA   #IMPLIED
                    min     CDATA   #IMPLIED
                    max     CDATA   #IMPLIED
                    avg     CDATA   #IMPLIED
    >
]>
<!-- DTD END -->

<!-- DATA START -->
<dtype>
  <ec>
    <data element="A" unit="counts" min="0.6621" avg="0.6819" max="0.7089" />
    <data element="B" unit="counts" min="0.0463" avg="0.0473" max="0.0503" />
    <data element="C" unit="counts" min="0.1238" avg="0.1264" max="0.1344" />
  </ec>
</dtype>
<!-- DATA END -->

<!-- should be detected as not ok ! -->
<!--
<dtype>
  <ec>
    <data element="A" unit="counts" min="0.6621" avg="0.6819" max="0.7089" />
    <data element="B" unit="counts" min="0.0463" avg="0.0473" max="0.0503" />
    <data element="B" unit="counts" min="0.1238" avg="0.1264" max="0.1344" />
    <data element="C" unit="counts" min="0.1348" avg="0.1644" max="0.1654" />
  </ec>
</dtype>
-->

例如,我想限制 DTD 以允许一个属性 element="B"

这可能吗?

【问题讨论】:

    标签: xml validation dtd


    【解决方案1】:

    我认为 DTD 中唯一的选择是使属性类型为IDID 必须是 Name (http://www.w3.org/TR/REC-xml/#NT-Name),因此这可能不适用于您的数据。 (不过,它适用于您的示例数据中的 element 属性。)

    例如,此 XML 将无效,因为 element="A" 被使用了两次:

    <!DOCTYPE dtype
    [
        <!ELEMENT   dtype   (ea?, eb?, ec, ed?) >
        <!ELEMENT   ea      (data+)             >
        <!ELEMENT   eb      (ee+)               >
        <!ELEMENT   ec      (data+)             >
        <!ELEMENT   ed      (data+)             >
        <!ELEMENT   ee      (data+)             >
        <!ELEMENT   data    (#PCDATA)           >
    
        <!ATTLIST   ee
                        ef      CDATA   #REQUIRED
        >
        <!ATTLIST   data
                        element ID   #REQUIRED
                        value   CDATA   #IMPLIED
                        unit    CDATA   #IMPLIED
                        min     CDATA   #IMPLIED
                        max     CDATA   #IMPLIED
                        avg     CDATA   #IMPLIED
        >
    ]>
    <!-- DTD END -->
    
    <!-- DATA START -->
    <dtype>
        <ec>
            <data element="A" unit="counts" min="0.6621" avg="0.6819" max="0.7089" />
            <data element="B" unit="counts" min="0.0463" avg="0.0473" max="0.0503" />
            <data element="A" unit="counts" min="0.1238" avg="0.1264" max="0.1344" />
        </ec>
    </dtype>
    

    【讨论】:

    • Daniel,感谢您的回答,但我仍有问题。我第一次没有正确发布它,但我的 xml 也可能看起来像这样 &lt;dtype&gt; &lt;ec&gt; &lt;data element="A" ... /&gt; &lt;data element="B" ... /&gt; &lt;data element="C" ... /&gt; &lt;/ec&gt; &lt;ed&gt; &lt;data element="A" ... /&gt; &lt;/ed&gt; &lt;/dtype&gt;,这将是无效的——每个 &lt;data element="X" ... /&gt; 可能在 xml 文件中出现多次,但我想拥有每个部分有效。任何提示如何做到这一点?
    • @akm - 我认为您无法使用 DTD 完成此任务。我认为您可以使用模式,但很长一段时间以来我都不需要做类似的事情。如果您愿意,我可以在空闲时间尝试提出一个架构。
    • Daniel,感谢您的努力,但我认为您不需要花时间在这上面。我只是在想/希望有一种简单的方法来实现这一点。这个 xml 是从我的 SQL 服务器生成的,需要将信息传输到我的计算引擎 (Mathematica); xml 生成过程应确保没有重复项。也许,我只是在寻找一种“保险”来 100% 保证它。我将花更多时间在 xml 生成和读取过程上,以拥有独特的属性。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    相关资源
    最近更新 更多