将#PCDATA放在DTD混合内容中

时间:2016-11-14 17:36:49

标签: xml xml-parsing xml-dtd mixed

实际上可以指定元素可以包含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元素必须首先出现?

1 个答案:

答案 0 :(得分:2)

是的,您在此处指定的是{{3>}中定义的混合内容。 混合内容声明

  

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

实际上,对此的限制是:

  1. #PCDATA必须先出现;
  2. 您可以在之后提供标签列表,每个标签只能出现一次;
  3. 最后允许的唯一出现规范是*
  4. 所以基本上#PCDATA必须首先出现的原因是,因为规范要求