web前端

位置:IT落伍者 >> web前端 >> 浏览文章

XML入门的常见问题解决集合(四)


发布日期:2024年01月10日
 
XML入门的常见问题解决集合(四)

在 XML 对象模型中如何处理空白字符?

有些时候XML 对象模型将显示包含空白字符的 TEXT 节点空白字符被截断后多半会带来一些混乱例如下面的 XML 例子

]>

Smith

John

生成下列树

Processing Instruction: xml

DocType: person

ELEMENT: person

TEXT:

ELEMENT: lastname

TEXT:

ELEMENT: firstname

TEXT:

名字和姓氏两边是只包含空白字符的 TEXT 节点因为person元素的内容模型是 MIXED它包含 #PCDATA 关键字MIXED 内容模型指定元素之间可以有文本存在因此下面的内容也是正确的

My last name is Smith and my first name is

John

结果是类似于下面的树

ELEMENT: person

TEXT: My last name is

ELEMENT: lastname

TEXT: and my first name is

ELEMENT: firstname

TEXT:

如果没有单词is之后和 之前的空白字符以及 之后和单词and之前的空白字符那么句子便无法理解因此对于 MIXED 内容模型来说文字组合空白字符和元素都是相关的对于非 MIXED 内容模型来说则不是这样

要使只有空白字符的 TEXT 节点消失请从person元素声明中删除 #PCDATA 关键字

结果是下面清晰的树

Processing Instruction: xml

DocType: person

ELEMENT: person

ELEMENT: lastname

ELEMENT: firstname

XML 声明做什么?

XML 声明必须列在 XML 文档的顶部

它指定下面的项目

该文档是 XML 文档在丢失或者还没有指定 MIME 类型时 MIME 探测器可以用它来检测文件是否为类型 text/xml

文档符合 XML 规范在以后 XML 有其他版本时这一点很重要

文档字符编码编码属性是可选的默认为 UTF

注意XML 声明必须在 XML 文档的第一行因此下面的 XML 文件

产生下面的分析错误

无效的 xml 声明

:

位置 : ^

注意XML 声明是可选的如果需要在顶部指定注释或者处理指令那么请不要放入 XML 声明但是默认的编码将为 UTF

如何以可读格式打印我的 XML 文档?

在用 DOM 从零开始构造文档以产生 XML 文件时任何内容都在一行上相互之间没有空格这是默认的行为

构造在 Internet Explorer 中的默认 XSL 样式表以可读格式显示和打印 XML 文档例如如果已经安装了 IE请尝试查看 nospacexml 文件浏览器中应该显示下面的树

XYZ

在 XML 中没有插入空白字符

打印可读 XML 是非常有趣的特别是有定义不同类型内容模型的 DTD 时例如在混合内容模型 (#PCDATA) 下不能插入空格因为它可能改变内容的含义比如请考虑下面的 XML

Elephant

这最好不输出为

E

lephant

因为单词边界不再正确

所有这些都使自动化打印成为问题如果不需要打印可读 XML那么可以使用 DOM 在适当的位置插入空白字符作为文本节点

如何在 DTD 中使用名称空间? 要在 DTD 中使用名称空间请在使用它的元素的 ATTLIST 声明中声明它如下所示

名称空间类型必须为 #FIXED属性的名称空间也是这样

名称空间和 XML 架构

DTD 和 XML 架构不能混合例如下面的

xmlns:x CDATA #FIXED xschema:myschemaxml

将不导致使用在 myschemaxml 中定义的架构定义对 DTD 和 XML 架构的使用是互斥的

如何在 Visual Basic 中使用 XMLDSO?

使用下面的 XML 作为例子

Mark Hanson

Jane Smith

可以按如下方式绑定到 ADO 记录集

创建新的 VB 项目

添加对 Microsoft ActiveX Data Objects 或更高版本Microsoft Data Adapter Library 和 Microsoft XML 版的引用

用下面的代码将 XML 数据加载到 XML DSO 控件中

Dim dso As New XMLDSOControl

Dim doc As IXMLDOMDocument

Set doc = dsoXMLDocument

docLoad (d:\testxml)

用下面的代码将 DSO 映射到使用 DataAdapter 的新记录集对象中

Dim da As New DataAdapter

Set daObject = dso

Dim rs As New ADODBRecordset

Set rsDataSource = da

访问数据

MsgBox rsFields(name)Value

结果显示字符串Mark Hanson

如何在 Java 中使用 XML DOM?

必须已经安装 MSXMLDLL 的 IE 版本在 Visual J++ 从项目菜单选择添加 COM 包装程序然后从 COM 对象列表中选择Microsoft XML 该操作将把所需的 Java 包装程序构造到称为msxml的新软件包中这些预先构造的 Java 包装程序也可以下载类可以按如下方法使用

import *;

import msxml*;

public class Class

{

public static void main (String[] args)

{

DOMDocument doc = new DOMDocument();

docload(new Variant(file://d:/samples/otxml));

Systemoutprintln(Loaded + docgetDocumentElement()getNodeName());

}

}

代码示例将从 sun religion 示例中加载 MB 测试文件otxmlVariant 类用于包装 Win VARIANT 基本类型

因为在每次检索节点时实际上都获得了新的包装程序因此不能在节点上使用指针比较因此不要使用下面的代码

IXMLDOMNode root = docgetDocumentElement();

IXMLDOMNode root = docgetDocumentElement();

if (root == root)

而要使用下面的代码

if (ComLibisEqualUnknown(root root))

class 包装程序的总大小大约为 KB但是为了与 WC 规范完全符合应该只使用 IXMLDOM* 包装程序下面的类是旧的 IE XML 接口可以从 msxml 文件夹中删除它们

IXMLAttribute*

IXMLDocument* XMLDocument*

IXMLElement*

IXMLError*

IXMLElementCollection*

tagXMLEMEM_TYPE*

_xml_error*

这使大小减少为 KB同时还可以删除下面的项目

DOMFreeThreadedDocument

在 Java 应用程序中从多个线程访问 XML 文档

XMLHttpRequest

用 XML DAV HTTP 扩展与服务器通信

IXTLRuntime

定义 XSL 样式表脚本对象

XMLDSOControl

绑定到 HTML 页面中的 XML 数据

XMLDOMDocumentEvents

在分析过程中返回回调

这可以将大小减少到 KB要使它更小请考虑 DOM 本身有两层的事实核心层包括

DOMDocument IXMLDOMDocument

IXMLDOMNode*

IXMLDOMNodeList*

IXMLDOMNamedNodeMap*

IXMLDOMDocumentFragment*

IXMLDOMImplementation

IXMLDOMParseError

和用户可能需要保留的 DTD 信息

IXMLDOMDocumentType

IXMLDOMEntity

IXMLDOMNotation

XML 文档中的所有节点类型都是 IXMLDOMNode它提供全部功能但是存在每种节点类型的更高级别的包装程序因此如果修改 DOMDocument 包装程序并将这些特定类型更改为使用 IXMLDOMNode那么所有下面的接口都可以删除

IXMLDOMAttribute

IXMLDOMCDATASection

IXMLDOMCharacterData

IXMLDOMComment

IXMLDOMElement

IXMLDOMProcessingInstruction

IXMLDOMEntityReference

IXMLDOMText

删除这些将使大小减少到 KB但是对 IXMLDOMElement 来说getAttribute 和 setAttribute 方法都是有用的否则需要使用

IXMLDOMNodegetAttributes()setNamedItem()

               

上一篇:解决XMLHTTP提交过时返回乱码问题

下一篇:Xml WebService完全实例解析(4)