0

我正在用 Java 编写一个使用 XOM 输出 XHTML 的小型应用程序。

问题是 XOM 在所有 html 之前放置了以下标记:

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

我已经阅读了他们的文档,但我似乎找不到如何删除这个标签。多谢你们。

编辑:我正在使用 XOM 的 Serializer 类输出到文件

追问:如果在 DOCTYPE 之前使用 XML 标签是好的做法,为什么没有任何网站使用它?另外,为什么 W3C 验证器在看到 XML 标记时会给我和错误?这是错误:

Illegal processing instruction target (found xml)

最后,如果我将 XML 标记放在我的 DOCTYPE 之前,这是否意味着我不必在我的 html 标头中指定 <meta charset="UTF-8" />?

4

3 回答 3

3

这行得通吗?这在 Javadoc 中列出

protected void writeXMLDeclaration() 抛出 IOException

你可以覆盖它,什么也不做......

同意你通常应该输出序言

于 2011-04-30T02:03:58.970 回答
3

该标记作为 XML 和 XHTML 有效,是一种很好的做法。应该没有理由删除它。

把它留在那里......或者修复任何期望它不存在的东西。


如果您不相信我,请看一下XHTML 1.1 规范的这段摘录。

"XHTML 1.1 文档示例

 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 <html version="-//W3C//DTD XHTML 1.1//EN"
       xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.w3.org/1999/xhtml
                      http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd"
 >
   <head>
     <title>Virtual Library</title>
   </head>
   <body>
     <p>Moved to <a href="http://example.org/">example.org</a>.</p>
   </body>
 </html>

请注意,在此示例中,包含 XML 声明。并非所有 XML 文档都需要上述 XML 声明。XHTML 文档作者应该在他们的所有文档中使用 XML 声明。当文档的字符编码不是默认的 UTF-8 或 UTF-16 并且更高级别的协议没有指定编码时,XHTML 文档作者必须使用 XML 声明。”


顺便说一句,W3C 验证服务说没问题……但如果<?xml ...?>标签前有任何空格,它就会抱怨。

于 2011-04-30T02:05:58.693 回答
3

假设您希望将 XHTML 作为text/html内容类型提供服务,那么您希望删除 XML 声明是正确的,因为如果您不这样做,它将使 IE6 进入怪癖模式。

MJB 建议的覆盖writeXMLDeclaration()看起来是一个很好的方法。

但是您应该知道,使用 XML 序列化程序并将输出作为text/html.

最有可能的是,输出会产生这样的标签:<script src="myscript.js" />。浏览器(Safari 除外)不会将其视为脚本自结束标签,而是将其视为脚本开始标签,随后的所有内容都将被视为脚本的一部分,而不是由浏览器呈现。

您可能需要覆盖您的序列化程序以使其能够识别 HTML 以解决此问题。我建议重写该writeEmptyElementTag()函数,并且对于名称不在list 中的所有元素"area", "base", "basefont", "bgsound", "br", "col", "command", "embed", "frame", "hr", "isindex", "image", "img", "input", "keygen", "link", "meta", "param", "source", "spacer" and "wbr",调用writeStartTag()and thenwriteEndTag()而不是默认行为。

最后,如果我将 XML 标记放在我的 DOCTYPE 之前,这是否意味着我不必<meta charset="UTF-8" />在我的 html 标头中指定?

不,它没有。当用作text/html时,浏览器会简单地忽略 XML 声明,因此您仍需要通过其他方式(元标记或 HTTP 标头)提供字符编码。

于 2011-04-30T09:53:50.310 回答