2016-11-14 2 views
2

Фактически можно указать, что элемент может содержать как PCDATA, так и другие элементы. Такая модель контента называется смешанной. Чтобы указать модель смешанного содержимого, просто список #PCDATA вместе с дочерними элементами вы хотите, чтобы:Место #PCDATA в DTD mixed Содержимое

<?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

Да, то, что вы указываете здесь, является тем, что называется смешанным контентом, как определено в w3C specification, §3.2.2. смешанного контента Декларация

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

И действительно ограничения для этого являются:

  1. #PCDATA должен появиться первый;
  2. вы можете предоставить список тегов после этого, каждый тег может появиться только один раз;
  3. и, наконец, разрешено только разрешение на вхождение *.

Поэтому в основном причина, почему #PCDATA должно произойти первое является , поскольку спецификация требует.

+0

Благодарим за подробное объяснение! Почему '' 'S? '# PCDATA'''' остается на первом месте (до '' '' # PCDATA'''')? Похоже, что тег может быть первым. –

+1

Нет - 'S?' Обозначить * пробел *. – potame

+0

@patame. ОК. Я вижу. Спасибо! –