将文档类型与 XML 一起使用

发布于 2024-07-16 06:48:00 字数 1503 浏览 9 评论 0 原文

我使用单独的 .dtd 文件作为自定义 xml 文件的文档类型:

names.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name SYSTEM "names.dtd">
<names>
    <name>
        <text>Pep&eacute;</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
    </name>
</names>

names.dtd

<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>

<!-- Placeholder/unknown history or creator name -->
<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">

但是,当尝试访问名称.xml 时,我得到以下信息错误:

XML 解析错误:未定义的实体 地点: http://localhost/.../names.xml 行 第 5 号,第 18 栏:

<text>Pep&eacute;</text>
---------^

仅供澄清,names.xml 和 names.dtd 位于同一目录中并使用 http ://localhost/.../names.dtd 也不起作用。

然而,当将 放入 names.xml 中的 中时,这似乎确实有效。 有人可以就此提出建议吗?

I'm using a seperate .dtd file as a doctype for my custom xml file:

names.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name SYSTEM "names.dtd">
<names>
    <name>
        <text>Pepé</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
    </name>
</names>

names.dtd

<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>

<!-- Placeholder/unknown history or creator name -->
<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">

However when trying to access names.xml I get the following error:

XML Parsing Error: undefined entity
Location:
http://localhost/.../names.xml Line
Number 5, Column 18:

<text>Pepé</text>
---------^

Just for clarification names.xml and names.dtd are in the same directory and using http://localhost/.../names.dtd doesn't work either.

This does seem to work when putting the <!ENTITY inside a <!DOCTYPE in names.xml however. Can anyone advise on this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

还在原地等你 2024-07-23 06:48:01

如果您在 Firefox 中打开文档来尝试确定 dtd 是否正确,请不要这样做。 Firefox 不会通过正确的 xml 解析器传递 xml 和 dtd。 在 IE 中打开您的 xml 文档,这将使您的文档通过 MSXML 解析器。

当在 IE 中打开 xml 文档时,它会抛出有关您的 DTD 使用无效字符的错误。 您需要使用 eacute 的字符代码而不是字符本身。 这是我要工作的代码......

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE NAME SYSTEM "names.dtd">
<names>
    <name>
        <text>Pepé</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
   </name>
</names>

并且

<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>

<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">

If you're opening the document in Firefox to try to find out if you have the dtd correct, don't. Firefox doesn't pass the xml and dtd through a proper xml parser. Open your xml document in IE which will cause your document to be passed through the MSXML parser.

When opening the xml document in IE, it will throw an error about your DTD using invalid characters. You need to use the character code for the eacute rather than the character itself. Here is the code I got to work...

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE NAME SYSTEM "names.dtd">
<names>
    <name>
        <text>Pepé</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
   </name>
</names>

and

<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>

<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">
铁憨憨 2024-07-23 06:48:01

Firefox 不会加载外部 DTD(Safari 也不会;它看起来没有浏览器这样做)。 您的 DTD 和 如果我告诉 xmllint 加载外部 DTD,XML 在 xmllint 中工作得很好:

$ xmllint --loaddtd names.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE names SYSTEM "names.dtd">
<names>
    <name>
        <text>Pepé</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
    </name>
</names>

编辑:正如 hsivonen 在评论中指出的那样,使用 DTD 来解析外部实体是一个 坏主意。 您通常不应在网络上使用 DOCTYPE 或 DTD。 如果您想验证文档,则应使用单独的架构(为此目的建议使用RELAX NG),并且不是嵌入在文档本身中的 DTD。

Firefox does not load external DTDs (nor does Safari; it looks like no browsers do). Your DTD & XML work fine in xmllint if I tell it to load external DTDs:

$ xmllint --loaddtd names.xml 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE names SYSTEM "names.dtd">
<names>
    <name>
        <text>Pepé</text>
        <creator>&lost;</creator>
        <history>&lost;</history>
    </name>
    <name>
        <text>Charles</text>
        <creator>James</creator>
        <history>&lost;</history>
    </name>
</names>

edit: As hsivonen points out in the comments, using DTDs to resolve external entities is a bad idea. You should generally not use DOCTYPEs or DTDs on the web. If you want to validate a document, you should use a separate schema (RELAX NG is recommended for this purpose), and not a DTD embedded in the document itself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文