169人参与 • 2024-05-19 • Xml
作者:angelgavin 出处:csdn
如何加载有外国和特殊字符的文档?
文档可以包含外国字符,例如:
foreign characters (úóí?)
例如 磲 的外国字符必须在前面加上 escape 序列。外国字符可以是 utf-8 编码或用不同编码指定,如下所示:
foreign characters (磲)
现在可以正确加载 xml 了。
其他字符是保留在 xml 中的,并且需要以不同的方式处理。下面的 xml:
this & that
产生如下错误:
此处不允许有空格。
行 0000001: this & that
位置 0000012: ----------^
此处 & 是 xml 句法结构的一部分,如果它仅仅放在 xml 数据源内部,那么不能解释为 &。您需要替换称为“实体”的特殊字符序列。
this & that
下面的字符需要相应的实体:
< <
& &
> >
" "
' '
引号字符被用作标记中属性值的定界符,因此通常不能在属性值的内部使用。例如,下面的内容将返回错误:
此处的单引号既用作属性定界符,又在属性值自身中。为了纠正这个问题,可以将属性定界符换成双引号:
或者可以将单引号转义为实体 '
上述两种方式都将通过 xml 对象模型中的 getattribute 方法返回属性值 john's stuff。同样,对于双引号,您可以使用实体
"。
也可以通过将文本放在 cdata 节中来处理元素内容中的特殊字符。下面的内容是正确的:
在本例子中,xml 对象模型将 cdata 节点显示 xml 节点的子节点,它将返回字符串
this & that is just "text" content.
作为 nodevalue。
如何在 visual studio 6.0 c++ 中使用 msxml com 组件?
在 visual c++ 6.0 中使用 msxml com 组件的最简便方式是使用 #import 指令:
#import "msxml.dll" named_guids no_namespace#import "msxml.dll" named_guids no_namespace
它定义了所有 ixml* 接口和接口 id,从而可以在应用程序中使用它们了。也可以从 inetsdk 获取 msxml 类型库和头文件(英文),以及包含类 iids 的 uuid.lib。
如何在 xml 中使用 html 实体?
下面的 xml 包含 html 实体:
copyright ? 2000, microsoft inc, all rights reserved.
它产生下列错误:
引用未定义的实体 'copy'。
行: 1, 位置:23, 错误码:0xc00ce002
copyright ? 2000, ...
----------------------^
这是因为 xml 只有五个内置实体。关于内置实体的详细信息,请参阅如何加载有外国和特殊字符的文档?。
要使用 html 实体,需要用 dtd 定义它们。有关 dtd 的详细信息,请参阅 w3c xml 建议(英文)。要使用该 dtd,请将它直接包括在 doctype 标记中,如下所示:
copyright ? 2000, microsoft inc, all rights reserved.
要加载它,需要关闭 ixmldomdocument 接口的 validateonparse 属性。请尝试将它粘贴到“validator 测试页”中,关闭 dtd 验证,然后单击“验证”。请注意文档将加载,并且版权字符将显示在 validator 页面的末尾的 dom 树中。
如果已经完成了 dtd 验证,那么必须将作为参数实体的 html 实体包括在现有的 dtd 中,如下所示:
%htmlent;
%htmlent;
它将定义所有 html 实体,以便在 xml 文档中使用它们。
在元素内容中如何处理空白字符?
xml dom 有三种访问元素文本内容的方式:
属性 行为
nodevalue 按照原始的 xml 源中指定的那样,返回 text、cdata、comment 和 pi 节点上的原始文本内容(包括空白字符)。对于 element 节点和 document 本身,则返回空值。
数据 与 nodevalue 相同
文本 重复连接指定子树中的多个 text 和 cdata 节点并返回组合结果。
注意: 空白字符包括新行、tab 和空格。
nodevalue 属性通常返回原始文档中的内容,与文档如何加载和当前 xml:space 范围无关。
文本属性连接指定子树中的所有文本并扩展实体。这与文档如何加载、preservewhitespace 开关的当前状态和当前 xml:space 范围有关,请看如下所示:
preservewhitespace = true when the document is loaded
preservewhitespace=true | preservewhitespace=true | preservewhitespace=false | preservewhitespace=false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
保留 | 保留 | 保留 | 保留并截断 |
preservewhitespace = false when the document is loaded
preservewhitespace=true | preservewhitespace=true | preservewhitespace=false | preservewhitespace=false |
xml:space=preserve | xml:space=default | xml:space=preserve | xml:space=default |
半保留 | 半保留并截断 | 半保留 | 半保留并截断 |
此处的保留表示和原始 xml 文档中完全相同的原始文本内容,截断意味着前导和尾部空格已经删除,半保留意味着保留了“重要的空白字符”并规范化了“不重要的空白字符”。重要的空白字符是文本内容内部的空白字符。不重要的空白字符是标记之间的空白字符,请看如下所示:
\n
\t jane\n
\tsmith \n
在本示例中,红色是可以忽略的不重要的空白字符,而绿色是重要的空白字符,因为它是文本内容的一部分,因此有不可忽略的重要含义。所以在本例中,文本属性返回下列结果:
状态 返回值
保留 "\n\t jane\n\tsmith \n"
保留并截断 "jane\n\tsmith"
半保留 " jane smith "
半保留并截断 "jane smith"
请注意“半保留”将规范化不重要的空白字符,例如,新行和 tab 字符将退化为单个空格。如果更改 xml:space 属性和 preservewhitespace 开关,那么文本属性将返回相应的不同值。
cdata and xml:space="preserve" subtree boundaries
在下面的例子中,cdata 节点或“保留”节点的内容将得到连接,原因是它们不参与不重要的空白字符规范化。例如:
\n
\t jane \n
\t smith ]>\n
在这种情况下,cdata 节点内部的空白字符不再与“不重要”空白字符“合并”,并且不会截断。因此“半保留并截断”情况将返回下列内容:
"jane smith "
在此, 和 标记之间的不重要的空白字符将包括在内,与 cdata 节点的内容无关。如果用下列内容代替 cdata,那么将返回相同结果:
smith
实体是特殊的
实体是作为 dtd 的一部分加载和分析的,并且显示在 doctype 节点下。它们不一定要有任何 xml:space 范围。例如:
jane \n
\t\n
">
]>
&jane;
假定 preservewhitespace=false(在 doctype 标记范围内),在分析实体时不重要的空白字符丢失。实体将不会有空白字符节点。树将类似于:
doctype foo
entity: jane
element: employee
element: name
text: jane
element: title
text>:software design engineer
element: foo
attribute: xml:space="preserve"
entityref: jane
请注意,在 doctype 内部 entity 节点下显露的 dom 树不包含任何 whitespace 节点。这意味着 entityref 节点的子节点也没有 whitespace 节点,即使实体引用在 xml:space="preserve" 的范围内也是这样。
给定文档中引用的每个 entity 的实例通常都有相同的树。
如果实体必须绝对保留空白字符,那么它必须在自己内部指定自己的 xml:space 属性,或者文档 preservewhitespace 开关必须设置为 true。
如何处理属性中的空白字符?
有几种方式可以访问属性值。ixmldomattribute 接口有 nodevalue 属性,它等价于作为 microsoft 扩展的 nodevalue 和 text 属性。这些属性返回: 属性 返回的文本
attrnode.nodevalue
attrnode.value
getattribute("name") 返回和原始文档中完全相同的内容(和扩展的实体)。
attrnode.nodetypedvalue null
attrnode.text 除了前导和尾部的空白字符已经截断之外,其他与 nodevalue 相同。
“xml 语言”规范为 xml 应用程序定义了下列行为: 属性类型 返回的文本
cdata id、idref、idrefs、entity、entities、notation、枚举
半规范化 全规范化
在此半规范化代表将新行和 tab 字符转换为空格,但是多个空格不会退化为一个空格。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论