XML 无效 DTD 错误

标签 xml validation dtd

.

在线验证: http://xmlvalidator.new-studio.org

XML Document (也显示在下面)

问题 1

当我取消注释以下行时。 4

<!ELEMENT persona (#PCDATA|(name,dob?,address*)) >

并注释以下行号。 5

<!ELEMENT persona (name,dob?,address*) >

为什么会出现以下错误?

  • 第 4 行第 28 列:元素类型“persona”的声明中需要元素类型。

在这里,我希望用户可以使用可解析的字符串,或者可以编写姓名、出生日期和地址标签并在其中写入信息。

问题 2

当我将编码从“ISO-8859-1”替换为“utf-8”,并在浏览器(Google Chrome)中加载页面时;它显示以下错误。

error on line 2 at column 21: Encoding error

但是验证成功并且正常。

为什么会显示该错误? 哪种编码好?

嵌入 DTD 的 XML 文档

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE personality [
<!ELEMENT personality (persona*) >
<!-- <!ELEMENT persona (#PCDATA|(name,dob?,address*)) > -->
<!ELEMENT persona (name,dob?,address*) >
<!-- <!ELEMENT name (#PCDATA|(first_name,last_name)) > -->
<!ELEMENT name (first_name,last_name) >
<!ELEMENT first_name (#PCDATA) >
<!ELEMENT last_name (#PCDATA) >
<!ELEMENT dob (date+,month+,year+) >
<!ELEMENT date (#PCDATA) >
<!ELEMENT month (#PCDATA) >
<!ELEMENT year (#PCDATA) >
<!ELEMENT address (building,street,city,state,country,country_code) >
<!ELEMENT building (#PCDATA) >
<!ELEMENT street (#PCDATA) >
<!ELEMENT city (#PCDATA) >
<!ELEMENT state (#PCDATA) >
<!ELEMENT country (#PCDATA) >
<!ELEMENT country_code (#PCDATA) >

<!ATTLIST persona id ID #REQUIRED >
<!ATTLIST name type (string|number) "string" >
<!ATTLIST dob type (string|number) "number" >
<!ATTLIST address type (string|number) "string" >

<!ENTITY author "Miguel Pitts" >
<!ENTITY website "example.com" >
<!ENTITY email "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a9c4c0cedcccc5d9c0ddddda9de4e7e9ddccc5ccc6dac8dcdbda87d1d0d3" rel="noreferrer noopener nofollow">[email protected]</a>" >
<!ENTITY copyright "Copyright © Miguel Pitts" >

]>

<?xml-stylesheet type="text/css" href="xmlstyle.css" ?>

<personality>
    <persona id="p1">
        <name type="string">
            <first_name>Miguel</first_name>
            <last_name>Pitts</last_name>
        </name>
        <dob type="number">
            <date>12</date>
            <month>02</month>
            <year>1989</year>
        </dob>
        <address type="string">
            <building>1233</building>
            <street>15</street>
            <city>NY</city>
            <state>Bangkok</state>
            <country>China</country>
            <country_code>82</country_code>
        </address>
    </persona>
</personality>

最佳答案

在这里,我希望用户可以使用可解析的字符串,或者可以编写姓名、出生日期和地址标签并在其中写入信息。

可以理解,但 XML 规范不允许(原因由 Nic Gibson 在 another SO question 中概述)。最好的办法是稍微重新设计 XML;例如,您可以声明

<!ELEMENT persona (str | (name,dob?,address*) ) >
<!ELEMENT str (#PCDATA) >

或者你可以声明

<!ELEMENT persona_simple (#PCDATA) >
<!ELEMENT persona_struct (name,dob?,address*) >

为什么会显示该错误?哪种编码好?

这些是技巧问题吗?它显示该错误,因为它检测到输入的字符编码不可能是声明的字符编码。通过“哪种编码好?”我假设您的意思是“我应该在文档的编码声明中命名哪种编码?” -- 该问题的答案是“您在文档中使用的编码”。如果您问这个问题,我想您不确定您的文档实际使用哪种编码;从您描述的行为来看,该文档实际上似乎没有使用 UTF-8,而是使用 ISO 8859 第 1 部分。

关于XML 无效 DTD 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14254213/

相关文章:

java - 通过 Apache CXF 框架生成 Web 服务时出错

c# - 使用 Controller 或 View 外部的元数据验证对象

javascript - 前端还是后端匹配密码?

java - 修改XML文件

ios - XML 到 NSDictionary 的 NSArray

java - 我的动画按钮显示的时间不够长

java - Spring MVC 跳过 Validator 类

xml - 是否可以在内部使用 XML 模式,就像 DTD 一样?

xml - 在单元测试中验证 XML 的最佳方法是什么?

xml - 在另一个 DTD 中包含一个 DTD