【问题标题】:SVG in HTML5 – when is XML declaration `<?xml version="1.0" encoding="UTF-8"?>` needed?HTML5 中的 SVG – 什么时候需要 XML 声明 `<?xml version="1.0" encoding="UTF-8"?>`?
【发布时间】:2016-11-05 06:52:10
【问题描述】:

在 HTML5 中使用 SVG 时:SVG 是否需要 XML 声明 &lt;?xml version="1.0" encoding="UTF-8"?&gt;

  • 作为图片通过&lt;img&gt;
  • 作为 CSS background-images?

这与“Are SVG parameters such as 'xmlns' and 'version' needed”略有关系。两个答案和MDN Namespace crash course 澄清了命名空间问题必要时

但是 SVG 1.1 不包含关于 XML 声明的必要性或何时可以省略的声明?

没有声明的例子:

<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 200 200">
  <circle id="circle--red" cx="30" cy="30" r="30" fill="#f00"/>
</svg>

2016 年 7 月 4 日更新:澄清了关于 XML 声明的问题。谢谢@Martin Honnen! 2017 年 10 月 24 日更新:更改为 “UTF-8“ uppercase 和 SVGO 优化的属性顺序。

【问题讨论】:

  • &lt;?xml version="1.0" encoding="utf-8"?&gt; 是 XML 声明,它不是文档类型。
  • stackoverflow.com/a/7007781/1696030 上提供了关于 XML 声明的一般 XML 文件必要性的深入回答。简而言之,在 XML 版本 1.0 中,声明是可选的,但您可能遇到编码或某些(文本)编辑器的问题。

标签: xml html svg xml-declaration


【解决方案1】:

对于 HTML5,正确的DOCTYPE declaration

<!DOCTYPE html> 

需要为浏览器指定全标准模式。

你所展示的,

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

XML declaration。是optional for XML 1.0required for XML 1.1,但是

  • XML 1.1 并未广泛使用。
  • version="1.0"encoding="utf-8" 无论如何都是默认值。

当您希望指定不同的编码时,在 HTML5 中使用 XML 声明,尤其是当文件可能不仅被浏览器使用,而且还被 XML 处理器使用时。

有关详细信息,请参阅 HTML5: A vocabulary and associated APIs for HTML and XHTML

关于内部 SVG 的注意事项(感谢 @Quentin):嵌入在 HTML5 文档中的 SVG 不应具有独立的 XML 声明。在格式良好的 XML 中只允许 一个 XML 声明,并且 它必须在顶部, 如果在任何地方。有关 XML 声明放置要求的更多详细信息,请参阅this answer

关于外部 SVG 的注意事项(感谢 @Kaiido):通过 HTML5 img 或 CSS background-images 引用的 SVG 必须有自己的 XML 声明,并且应该使用以下 DOCTYPE 声明:

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
          "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

关于外部 SVG(更新)的说明(感谢 @user314159):

每个1.3. SVG namespace and DTDScalable Vector Graphics (SVG) 2 W3C Working Draft 09 July 2015

本规范中没有提供 DTD,因为 DTD 用于 众所周知,验证文件是有问题的。特别是,DTD 不优雅地处理命名空间和它们的约束范围 能表达的有限。 建议作者不要包括 SVG 文档中的 DOCTYPE 声明。

[强调添加。]

【讨论】:

  • 为了清楚起见,可能值得一提的是,XML 声明应该在文档的顶部,并且 HTML 5 中的内联 SVG 是 HTML 5 文档的一部分,不是独立的,也不应该有它自己的 XML 声明。
  • 对外部 svg 只字未提?这就是问题的重点......“作为内联图像通过&lt;img&gt; 作为 CSS 背景图像”。在这些情况下,您应该保留 xml 声明和 doctype,它们应该是 &lt;!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"&gt; btw。
  • 已更新答案以反映 Quentin 和 Kaiido 的有用建议。谢谢!
  • 仅供参考:SVG2 工作草案/建议建议,建议对 SVG 文档完全不使用 DOCTYPE。但是,在 XML 中使用 SVG 确实需要 xmlns,而在 HTML 中则不需要。 “本规范中没有提供 DTD,因为使用 DTD 来验证文档是有问题的。特别是,DTD 不能优雅地处理命名空间,并且它们可以表达的约束范围是有限的。建议作者这样做不要在 SVG 文档中包含 DOCTYPE 声明。” -- w3.org/TR/2015/WD-SVG2-20150709/intro.html#Namespace
  • 回答更新以反映@user314159 的有用建议。谢谢!
【解决方案2】:

我在https://oreillymedia.github.io/Using_SVG/extras/ch01-XML.html 找到了不需要 XML 和 DOCTYPE 声明的信息...

仅当您使用非 Unicode 字符编码(技术上是 UTF-8 或 UTF-16 以外的任何字符)时才需要 XML 声明。

您还可以包含 SGML DOCTYPE 声明,但不再推荐用于 SVG。

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2013-10-13
    • 1970-01-01
    相关资源
    最近更新 更多