将文档类型与 XML 一起使用
我使用单独的 .dtd 文件作为自定义 xml 文件的文档类型:
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 "é">
但是,当尝试访问名称.xml 时,我得到以下信息错误:
XML 解析错误:未定义的实体 地点: http://localhost/.../names.xml 行 第 5 号,第 18 栏:
<text>Pepé</text>
---------^
仅供澄清,names.xml 和 names.dtd 位于同一目录中并使用 http ://localhost/.../names.dtd 也不起作用。
然而,当将 放入
names.xml
中的 中时,这似乎确实有效。 有人可以就此提出建议吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您在 Firefox 中打开文档来尝试确定 dtd 是否正确,请不要这样做。 Firefox 不会通过正确的 xml 解析器传递 xml 和 dtd。 在 IE 中打开您的 xml 文档,这将使您的文档通过 MSXML 解析器。
当在 IE 中打开 xml 文档时,它会抛出有关您的 DTD 使用无效字符的错误。 您需要使用 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...
and
Firefox 不会加载外部 DTD(Safari 也不会;它看起来没有浏览器这样做)。 您的 DTD 和 如果我告诉 xmllint 加载外部 DTD,XML 在 xmllint 中工作得很好:
编辑:正如 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:
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.