xml - 将 #PCDATA 放入 DTD 混合内容中

标签 xml xml-parsing 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元素必须放在第一位?

最佳答案

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

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

事实上,其限制是:

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

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

关于xml - 将 #PCDATA 放入 DTD 混合内容中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40594635/

相关文章:

java - 将 XML 转换为 JSON 忽略属性

java - 如何将数据放入XML的ListView中?

scala - Play Framework : parse XML to model

xml - 在 XML DTD 中使用 + 运算符

xml - 为什么我不能放一个 xs :all inside a xs:sequence?

c# - 如何使用 C# 将自定义 XML 添加到打开的 Excel 2007 工作簿?

python - 使用 Python 3 解析 xml 中的 html(或其他 xml)

Python通过python生成xml文件

java - parser.setFeature 与 parser.setValidating

xml - 调查 : how are you using ID/IDREF?(或 key/keyref)