王朝网络
分享
 
 
 

XML 中的常见问题 (三)

王朝other·作者佚名  2006-12-16
宽屏版  字体: |||超大  

如何加载有外国和特殊字符的文档?

文档可以包含外国字符,例如:

foreign characters (úóí?)

例如 磲 的外国字符必须在前面加上 escape 序列。外国字符可以是 UTF-8 编码或用不同编码指定,如下所示:

foreign characters (磲)

现在可以正确加载 XML 了。

其他字符是保留在 XML 中的,并且需要以不同的方式处理。下面的 XML:

This & that

产生如下错误:

此处不允许有空格。

行 0000001: This & that

位置 0000012: ----------^

此处 & 是 XML 句法结构的一部分,如果它仅仅放在 XML 数据源内部,那么不能解释为 &。您需要替换称为“实体”的特殊字符序列。

This & that

下面的字符需要相应的实体:

< <

& &

> >

" "

' &apos;

引号字符被用作标记中属性值的定界符,因此通常不能在属性值的内部使用。例如,下面的内容将返回错误:

此处的单引号既用作属性定界符,又在属性值自身中。为了纠正这个问题,可以将属性定界符换成双引号:

或者可以将单引号转义为实体 &apos;

上述两种方式都将通过 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 字符转换为空格,但是多个空格不会退化为一个空格。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有