- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
在 XML DTD 中——当定义一个元素时,我们使用#PCDATA 表示这个元素可以包含任何可解析的文本。在定义一个属性时,我们用CDATA表示它的值可以是任何字符数据。
XML 中使用的 CDATA 是不被 XML 解析器解析的东西(多字符转义序列)。一致地,当我们使用 CDATA 来定义属性时;解析器不应该解析它。但是,确实如此!
那么,为什么不能用 PCDATA 代替 CDATA 来定义属性呢?
更新 - 一直保持这种方式以与 SGML 向后兼容。 SGML 中这种命名背后的原因是什么?
最佳答案
当用于属性的声明值时,CDATA 指的是属性的实际值(字符数据),而不是解析它的上下文。另一方面,在解析元素时,我们需要区分无标记字符数据 (CDATA) 和预期的已解析字符数据(PCDATA)。
乍一看这似乎是任意的,但事实并非如此(参见 here 和 here)。
在 SGML 中,属性值规范可以被引用(属性值文字)或不被引用(属性值)。
attribute value specification = attribute value literal | attribute value
当属性未被引用时,只允许使用 NAME 字符,并且对于某些声明的值(例如 NUMBER)可能会进一步限制。
另一方面,属性值文字的内容是一系列可替换字符数据,由 LIT/LITA 定界符(分别为双引号和单引号)包围, 在引用具体语法中)。
attribute value literal =
( LIT , replaceable character data *, LIT) |
( LITA , replaceable character data *, LITA)
可替换字符数据“类似于 CDATA,除了可以识别实体引用和字符引用”(Goldfarb,SGML 手册)。
由此可见,属性值文字中实体引用的替换不依赖于属性的声明值。因此,如果你有 <!ENTITY foo "bar">
和 <elem attr="&foo;">
实体引用 &foo;
将在可替换字符数据(LIT 识别模式)的上下文中进行解析,产生 <elem attr=bar>
. attr
没关系声明为 CDATA、NAME 或其他。
更新
不必说属性中的实体必须解析,因为所有属性类型都有相同的解析规则:如果属性值以引号(LIT)开头,则实体被识别(可替换字符数据)当找到匹配的结束引号时,该值结束。
这里的CDATA是指一个有效的属性必须包含展开实体后的任意字符数据。如果将属性声明为 NUMBER,则需要包含数字字符(或扩展为数字字符的实体)。
在上面的示例中,值为 "&foo;"
的 CDATA 属性相当于"bar"
,与值为 "0"
的 NUMBER 属性相同相当于"0"
(即使序列 "0"
包含数字以外的字符)。
关于xml - XML DTD 中的 PCDATA 与 CDATA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20474113/
是否可以在我的 DTD 中声明一个可以有任何名称的元素?到目前为止,我了解到 ANY 只能用于以下数据类型: 任何帮助将不胜感激。 --阿里 最佳答案 不,ANY 关键字仅适用于元素的类别。无论如何
我得到了以下 DTD: 有人问我: This DTD is recursive! How does the recursion end? 嗯……我不明白为什么要递归?唯一递归的接缝
是否可以在另一个 DTD 中包含一个 DTD? (我的意思不是将第二个 DTD 复制并粘贴到第一个 DTD 中。我的意思是在第一个 DTD 中有一个指向第二个 DTD 的指针。) 最佳答案 是的,这是
我知道我应该将所有 html 元素放在 body 标签中,但我需要将两个隐藏的输入放在 html dtd 之上。我猜它不会使我的 html 文件成为标准文件,但有那么糟糕吗?我有以下代码。 什么
在输入文档中没有 any 文档类型的情况下,如何在解析文档时强制 SAX 解析器(特别是 Java 中的 Xerces)使用 DTD?这可能吗? 以下是我的场景的更多详细信息: 我们有一堆符合相同 D
我正在尝试通过 .dtd 验证 xml 文件。我写了这个验证器: public bool Validation(XmlDocument xmlDoc) { var xm
我有一个处理 HTTP 请求的网络服务。它收到的文档有一个嵌入的 DOCTYPE,指定了一个 .dtd 文件。我希望使用更新的 XML 架构验证文件,以便在更新的设备连接到我的服务时使用。 我可以成功
我在弄清楚 HXT 为何要替换我的 DTD 时遇到了一些麻烦。首先,这是我要解析的输入文件: foo foo 这是我得到的输出: foo
我能否定义一个 DTD,使其中的元素具有在外部 DTD 中定义的结构?我的意思是类似于以下内容(这是一个我知道在某些方面无效的示例,但希望它能让您了解我在寻找什么): 此处的尝试是表示消息
如何使用外部 DTD 文件来验证我的 XML 文件? DTD 将位于某些 url 上,例如http://localhost/example.dtd 并且 DTD 未在 XML 文件中引用,因此我需要在
以下声明出现在 html 4.01 dtds 中 (参见 http://www.w3.org/TR/REC-html40/sgml/dtd.html 在 strict.dtd 和 loose.dtd
我想知道是否有一个程序可以读取 DTD 规范,使用规范创建表单或控制台提示,使用表单/提示获取用户输入的数据,然后根据输入的数据编写 XML 文档. 有这样的程序吗? 例如,想象一下: [开始想象]
我想使用 JAXB 从 dtd 文件生成 Java 类。 dtd 看起来像这样: 使
我正在尝试对 xhtml 文档执行 xpath 查询。使用 .NET 3.5。 文档看起来像这样: .... ... 因为文档包含各种字符实体( 等),我
我发现了很多这样的例子: public static boolean validateXMLSchema(String xsdPath, String xmlPath){ tr
大家好: 我想获得网络浏览器的实际高度,但我对 W3C DTD HTML 4.01 和 //W3C 有一些困惑//DTC XHTML 1.0,以下是我的问题详情: 如果我在页眉顶部使用 W3C DTD
我正在使用 Java 6 并尝试解析以 开头的格式良好的文档 我下载了实体 DTD“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”,并将其放置在
这个问题已经有答案了: Xerces error: org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl (2 个回答) 已关闭 5 年前。 在 jboss w
这个问题在这里已经有了答案: Xerces error: org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl (2 个答案) 关闭 5 年前。 我正在使用
在下面的代码中: private Document transformDoc(Source source) throws TransformerException, IOException {
我是一名优秀的程序员,十分优秀!