【问题标题】:Place #PCDATA in DTD mixed Content将#PCDATA 放在DTD 混合内容中
【发布时间】:2017-03-28 10:30:46
【问题描述】:

实际上可以指定一个元素可以同时包含 PCDATA 和其他元素。这样的内容模型称为混合。要指定混合内容模型,只需列出#PCDATA 以及您要允许的子元素:

<?xml version = "1.0" standalone="yes"?>
<!DOCTYPE DOCUMENT [
<!ELEMENT DOCUMENT (CUSTOMER)*>
<!ELEMENT CUSTOMER (NAME,DATE,ORDERS)>
<!ELEMENT NAME (LAST_NAME,FIRST_NAME)>
<!ELEMENT LAST_NAME (#PCDATA)>
<!ELEMENT FIRST_NAME (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT ORDERS (ITEM)*>
<!ELEMENT ITEM (PRODUCT, NUMBER, PRICE)>
<!ELEMENT PRODUCT (#PCDATA | PRODUCT_ID)*>
<!ELEMENT NUMBER (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!ELEMENT PRODUCT_ID (#PCDATA)>
]>
<DOCUMENT>
    <CUSTOMER>
        <NAME>
            <LAST_NAME>Weber</LAST_NAME>
            <FIRST_NAME>Bill</FIRST_NAME>
        </NAME>
        <DATE>October 25, 2003</DATE>
        <ORDERS>
            <ITEM>
                <PRODUCT>Asparagus</PRODUCT>
                <NUMBER>12</NUMBER>
                <PRICE>$2.95</PRICE>
            </ITEM>
            <ITEM>
                <PRODUCT>Lettuce</PRODUCT>
                <NUMBER>6</NUMBER>
                <PRICE>$11.50</PRICE>
            </ITEM>
        </ORDERS>
    </CUSTOMER>
</DOCUMENT>

我注意到在使用验证器(.NET XML Parser、MSXML SAX、MSXML DOM、Java 内置)检查文件的正确性时,如果 #PCDATA 位于列表顶部 - 检查通过。如果在#PCDATA 之前是成员 - 存在验证错误。

为什么混合的#PCDATA元素一定要放在第一位?

【问题讨论】:

    标签: xml xml-parsing dtd mixed


    【解决方案1】:

    是的,您在此处指定的是所谓的混合内容,如w3C specification, §3.2.2 中所定义。 混合内容声明

    [51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'

    事实上,限制是:

    1. #PCDATA 必须先出现;
    2. 之后可以提供标签列表,每个标签只能出现一次;
    3. 最后唯一允许的出现规范是*

    所以基本上#PCDATA必须首先出现的原因是因为规范要求它

    【讨论】:

    • 感谢您的详细解释!为什么S? '#PCDATA' 是首先停留(在'#PCDATA' 之前)?一开始看起来可能是一个标签。
    • 否 - S? 代表 空白
    • @patame。好的。我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2010-10-29
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多