
怎样加载有外国和特别字符的文档?
文档能够包含外国字符,例如:
foreign characters (úóí?)
例如 ?磲 的外国字符必须在前面加上 escape 序列。外国字符能够是 UTF-8 编码或用不同编码指定,如下所示:
foreign characters (?磲)
现在能够正确加载 XML 了。
其他字符是保留在 XML 中的,并且需要以不同的方式处理。下面的 XML:
This & that 产生如下错误: 此处不允许有空格。 行 0000001: This & that 位置 0000012: ----------^
此处 & 是 XML 句法结构的一部分,假如他仅仅放在 XML 数据源内部,那么不能解释为 &。您需要替换称为“实体”的特别字符序列。
This & that 下面的字符需要相应的实体:
< < & & > > " " '
引号字符被用作标记中属性值的定界符,因此通常不能在属性值的内部使用。例如,下面的内容将返回错误:
此处的单引号既用作属性定界符,又在属性值自身中。为了纠正这个问题,能够将属性定界符换成双引号:
或能够将单引号转义为实体 '
上述两种方式都将通过 XML 对象模型中的 getAttribute 方法返回属性值 Johns 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 = false when the document is loaded
此处的保留表示和原始 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 字符转换为空格,但是多个空格不会退化为一个空格。
|