2013-04-08 2 views
1

Когда я использую xmllint для проверки своего DTD-файла, я получаю сообщение об ошибке. См. Выход ниже. Я не совсем уверен, где все пошло не так.Получение ошибки XML при проверке с помощью xmllint

book.dtd:1: parser error : StartTag: invalid element name 
<!ELEMENT books_for_sale (book+)> 
^ 
book.dtd:1: parser error : Extra content at the end of the document 
<!ELEMENT books_for_sale (book+)> 
^ 

Вот мой файл DTD

<!ELEMENT books_for_sale (book+)> 
<!ELEMENT book (book_id, title, author, co_author_name, editor_name, illustrator_name, language, ISBN, publisher, publisher_date, genre, subject, category, file_size, pages, price, payment_method)> 
<!ELEMENT book_id (#PCDATA)> 
<!ELEMENT title (#PCDATA)> 
<!ELEMENT author (#PCDATA)> 
<!ELEMENT co_author_name (#PCDATA)> 
<!ELEMENT editor_name (#PCDATA)> 
<!ELEMENT illustrator_name (#PCDATA)> 
<!ELEMENT language (#PCDATA)> 
<!ELEMENT ISBN (#PCDATA)> 
<!ELEMENT publisher (#PCDATA)> 
<!ELEMENT publisher_date (#PCDATA)> 
<!ELEMENT genre (#PCDATA)> 
<!ELEMENT subject (#PCDATA)> 
<!ELEMENT category (#PCDATA)> 
<!ELEMENT file_size (#PCDATA)> 
<!ELEMENT pages (#PCDATA)> 
<!ELEMENT price (#PCDATA)> 
<!ELEMENT payment_method (#PCDATA)> 

Не уверен, что если сочетание HTML и XML сделано правильно. Пробовал использовать пространство имен, чтобы сохранить эту сортировку. Но это для меня все ново, поэтому я не уверен, правильно написано.

<?xml version="1.0" encoding="utf-8"?> 

<!DOCTYPE books_for_sale SYSTEM "book.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:BO="http://resumator3000.com"> 

<!-- list book inventory --> 

<head> 
<title>Book Order</title> 
<link rel="stylesheet" type="text/css" href="book.css"></link> 
</head> 
<body> 

<div class="page-wrap"> 

<h3>Books for Sale</h3> 
<h4>Great Prices! Limted Selection! No Delivery!</h4> 

<!-- present books for sale --> 
<BO:books_for_sale> 

    <BO:book> 
     <p>Book ID: <BO:book_id>BK12345</BO:book_id></p> 
     <p>Book Title: <BO:title>Gray Geese Crying</BO:title></p> 
     <p>Author: <BO:author>Bill Nedham</BO:author></p> 
     <p>Co-Author: <BO:co_author_name>Surely Joking</BO:co_author_name></p> 
     <p>Editor: <BO:editor_name>Fried Brian</BO:editor_name></p> 
     <p>Illustrator: <BO:illustrator_name>Drew Sumthin</BO:illustrator_name></p> 
     <p>Language: <BO:language>Orangatang</BO:language></p> 
     <p>ISBN: <BO:ISBN>9912385748391</BO:ISBN></p> 
     <p>Publisher: <BO:publisher>Random Random Homes</BO:publisher></p> 
     <p>Publish Date: <BO:publisher_date>2001</BO:publisher_date></p> 
     <p>Genre: <BO:genre>Poetry</BO:genre></p> 
     <p>Subject: <BO:subject>Human Mind</BO:subject></p> 
     <p>Category: <BO:category>Self-Help</BO:category></p> 
     <p>File Size: <BO:file_size>122 MB</BO:file_size></p> 
     <p>Pages: <BO:pages>3</BO:pages></p> 
     <p>Price: <span id="dollar">$</span><BO:price>142.99</BO:price></p> 
     <p>Payment Method: <BO:payment_method>Paypal</BO:payment_method></p> 
    </BO:book> 

</BO:books_for_sale> 
</div> 

</body> 
</html> 

Не знаете, где это пошло не так.

ответ

1

Ваш DTD в порядке, но вы не можете проверить его напрямую с помощью xmllint; вам нужно проверить XML-файл.

Ваш другой файл является проблемой. Вы должны разделить XML, и поскольку вы используете DTD, не используйте пространство имен. (Вы можете переписать DTD, рассматривая объявления пространства имен как атрибут и префиксные элементы как полные имена, но в XML объявление пространства имен не является атрибутом и может появляться на любом элементе, а префиксы произвольны. Таким образом, понятия не переводятся хорошо.)

Другое дело, что рендеринг HTML будет игнорировать любые нестандартные теги, чтобы выгрузить весь текст документа. Когда вы переносите данные из XML в HTML (даже XHTML), обязательно помещайте данные, которые хотите отобразить в тегах HTML. Вы можете сделать это с помощью XSLT.

XML файл ...

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE books_for_sale SYSTEM "book.dtd"> 
<books_for_sale> 
    <book> 
     <book_id>BK12345</book_id> 
     <title>Gray Geese Crying</title> 
     <author>Bill Nedham</author> 
     <co_author_name>Surely Joking</co_author_name> 
     <editor_name>Fried Brian</editor_name> 
     <illustrator_name>Drew Sumthin</illustrator_name> 
     <language>Orangatang</language> 
     <ISBN>9912385748391</ISBN> 
     <publisher>Random Random Homes</publisher> 
     <publisher_date>2001</publisher_date> 
     <genre>Poetry</genre> 
     <subject>Human Mind</subject> 
     <category>Self-Help</category> 
     <file_size>122 MB</file_size> 
     <pages>3</pages> 
     <price>142.99</price> 
     <payment_method>Paypal</payment_method> 
    </book> 
</books_for_sale> 

Итак, если вы хотите производить HTML использовать таблицу стилей, как это: XSLT-файл ...

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<html> 
<head> 
<title>Book Order</title> 
<link rel="stylesheet" type="text/css" href="book.css"></link> 
</head> 
<body> 

<div class="page-wrap"> 

<h3>Books for Sale</h3> 
<h4>Great Prices! Limted Selection! No Delivery!</h4> 

<!-- present books for sale --> 
     <xsl:for-each select="books_for_sale/book"> 
     <div> 
      <p>Book ID: <xsl:value-of select="book_id" /></p> 
      <p>Price: <span id="dollar">$<xsl:value-of select="price" /></span></p> 
      <p>Payment Method: <xsl:value-of select="payment_method" /></p> 
     </div> 
     </xsl:for-each> 
    </div> 
    </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 
+0

Спасибо, что меня на правый трек Том. Я ценю ваши усилия. Я опубликую свой успех или неудачу, когда закончу мои модификации кода сегодня днем. –

+0

Том. Предлагаемый код, который вы написали, заставил меня правильно отслеживать. Я не уверен, как я получил объединенный файл HTML и XML, который я изначально опубликовал. Но я понимаю, что мои ошибки были и ценят вашу помощь. Огромное спасибо. –

Смежные вопросы