📄 using xml parsers.htm
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>使用XML解析器</TITLE>
<link rel="stylesheet" href="../../Global.css" tppabs="http://www.xml.org.cn:8188/Global.css"></HEAD>
<style type="text/css">
<!--
.normal10 { font-size: 11pt}
.normal9 { font-size: 9pt}
p{ font-size: 9pt}
a{ text-decoration: none }
a:hover{ color:Red;text-decoration:underline }
a {
font-size:9pt;
COLOR: cornflowerblue;
FONT-FAMILY: "新细明体", "宋体";
FONT-WEIGHT: bold
}
-->
</style>
<script language="JavaScript">
<!-- hide from JavaScript-challenged browsers
function openWindow1() { popupWin = window.open('list/list1.htm', '表1', 'scrollbars,resizable,width=640,height=480')
}
// done hiding -->
<!-- hide from JavaScript-challenged browsers
function openWindow2() { popupWin = window.open('list/list2.htm', '表2', 'scrollbars,resizable,width=640,height=480')
}
// done hiding -->
<!-- hide from JavaScript-challenged browsers
function openWindow3() { popupWin = window.open('list/list3.htm', '表3', 'scrollbars,resizable,width=595,height=480')
}
// done hiding -->
</script>
<BODY LINK="#0000ff">
<table width="85%" border="0" align="center">
<tr>
<td>
<div align="center">[<a href="../../default.asp.htm" tppabs="http://www.xml.org.cn:8188/default.asp">返回首页</a>] [<a href="../resource.htm" tppabs="http://www.xml.org.cn:8188/resource/resource.htm">返回资源</a>]</div>
</td>
</tr>
<tr>
<td><b>
<p align="CENTER"><font face="宋体" lang="ZH-CN" size="5" color="#0000FF"><a name="1"></a>使用</font><font size="5" color="#0000FF">XML</font><font face="宋体" lang="ZH-CN" size="5" color="#0000FF">解析器</font></p>
</b><font size=2>
<p align="CENTER"><a href="mailto:udell@monad.net">Jon Udell </a>最后更新:1999年7月28日</p>
</font></td>
</tr>
<tr>
<td>
<p><font face="楷体_GB2312" size="4">还等什么?快把你的HTML转变成XML...</font></p>
<p><font face="宋体" lang="ZH-CN"><span class="normal105">正在写书的当中,我涉及到了</span></font><span class="normal105">XML<font face="宋体" lang="ZH-CN">。我开始把文章写成</font>HTML<font face="宋体" lang="ZH-CN">的方式。这样确实很方便,让文字成为置标化的</font>ASCII<font face="宋体" lang="ZH-CN">形式使得编写程序、转换和添加数据十分容易。例如,我不必给各章节、图表编号,不用自己制表。</font>Perl<font face="宋体" lang="ZH-CN">脚本读取原始的</font>HTML<font face="宋体" lang="ZH-CN">产生更完善的</font>HTML<font face="宋体" lang="ZH-CN">输出,所有部分被编号并且相互链接。在输出中我把每一段都编号,在编号上增添能调用反馈功能的链接</font>—<font face="宋体" lang="ZH-CN">其一能将评论的电子邮件自动发送给我,其二将评论发送给私有的新闻组供小组成员讨论。</font></span></p>
<p> <span class="normal105"><font face="宋体" lang="ZH-CN">考虑过我写作的需要,我明白应该让</font>XML<font face="宋体" lang="ZH-CN">来做些事,而且这样的转换是很有意义的。我为什么不一开始就首选</font>XML<font face="宋体" lang="ZH-CN">呢</font>?
<font face="宋体" lang="ZH-CN">那大概是由于习惯的偏见。首先我承认自己一直因为需要编写和遵循文件类型定义</font>(DTD)<font face="宋体" lang="ZH-CN">而被唬住了。我曾听说了无数有关冗繁的</font>DTD<font face="宋体" lang="ZH-CN">项目的故事,它们耗费了大量的时间和资金却最终一无所获。其次,我不太清楚怎样编写</font>XML,<font face="宋体" lang="ZH-CN">尤其是如何显示</font>XML<font face="宋体" lang="ZH-CN">。</font></span></p>
<p> <span class="normal105"><font face="宋体" lang="ZH-CN">去年我参加</font>Perl<font face="宋体" lang="ZH-CN">大会回来后不得不尝试</font>XML<font face="宋体" lang="ZH-CN">。与会期间,</font>Tim
Bray<font face="宋体" lang="ZH-CN">(</font>OpenText<font face="宋体" lang="ZH-CN">的创始者,</font>XML<font face="宋体" lang="ZH-CN">规范的编者之一)指出了一个使我难忘的简单事实。“如果你在花时间写解析代码”,他和我说,“你就是在浪费时间。”</font>Tim
<font face="宋体" lang="ZH-CN">讲的没错。即使我只是曾在写清晰简单的</font>HTML,<font face="宋体" lang="ZH-CN">就已经为自己想要重写解析工具而深感愧疚。</font>XML<font face="宋体" lang="ZH-CN">的解析工具如雨后春笋般涌现,应该了解怎样使用这些工具。</font> <br>
<br>
<a href="#top"><span class="normal105"><<返回标题 </span></a></span><br>
</p>
<font face="宋体" lang="ZH-CN"></font>
<h4><b><font face="宋体" lang="ZH-CN"><a name="1"></a>从</font>HTML<font face="宋体" lang="ZH-CN">到</font>XML</b></h4>
<p><font face="宋体" lang="ZH-CN"><span class="normal105">很长时间我一直认为</span></font><span class="normal105">XML<font face="宋体" lang="ZH-CN">从最简单的方式来看不过是在</font>HTML<font face="宋体" lang="ZH-CN">基础上的些许改进。但是当我把六万五千字的</font>HTML<font face="宋体" lang="ZH-CN">原稿转换为结构良好的</font>XML<font face="宋体" lang="ZH-CN">时,原来的想法彻底改变了。利用一些文本编辑的宏,只用了一小时这些转换就大功告成了。转换过程的第一步要封闭所有的标记</font>(tag)<font face="宋体" lang="ZH-CN">。你需要用</font></p><font face="宋体" lang="ZH-CN">匹配每一个</font><p>,
<font face="宋体" lang="ZH-CN">对于所有成对的标记都如此。象</font><img src="fig.gif"><font face="宋体" lang="ZH-CN">这样的空标记也要闭合。就变成了这样</font>:<img
src="fig.gif"/><font face="宋体" lang="ZH-CN">。然后</font>, <font face="宋体" lang="ZH-CN">我必须给所有的属性项加上引号。</font><img
src=fig.gif><font face="宋体" lang="ZH-CN">这种形式就不能再出现了。</font> <font face="宋体" lang="ZH-CN">也没有了象</font><table
border><font face="宋体" lang="ZH-CN">这样的缺省属性。那必须变为</font><table border="0"><font face="宋体" lang="ZH-CN">。最后,我要处理逸出</font>(Escape)<font face="宋体" lang="ZH-CN">实体。我的原文使用了许多的</font>HTML<font face="宋体" lang="ZH-CN">结构,因此尖括弧写为</font><<font face="宋体" lang="ZH-CN">和</font>
><font face="宋体" lang="ZH-CN">。</font> <font face="宋体" lang="ZH-CN">如果有这样的符号,</font>XML<font face="宋体" lang="ZH-CN">就要求有多一个层次级别。这些实体必须变为</font>&lt;<font face="宋体" lang="ZH-CN">和</font>&gt;<font face="宋体" lang="ZH-CN">。</font>XML
<font face="宋体" lang="ZH-CN">处理器处理外层信息;而浏览器处理里层的内容。</font></span></p>
<p> <span class="normal105"><font face="宋体" lang="ZH-CN">新的成为一些</font>W3C<font face="宋体" lang="ZH-CN">技术测试容器的</font>Amaya
<font face="宋体" lang="ZH-CN">浏览器现在已经能够读入</font>HTML <font face="宋体" lang="ZH-CN">写出满足三项要求的相应的</font>XML<font face="宋体" lang="ZH-CN">。它也是</font>HTML/XML<font face="宋体" lang="ZH-CN">的编辑器,适用文本和结构的浏览。如果你感兴趣,在</font><a href="www.w3c.org" tppabs="http://www.xml.org.cn:8188/resource/article/www.w3c.org"><font size=2>www.w3c.org</font></a><font face="宋体" lang="ZH-CN">有</font>
Win32<font face="宋体" lang="ZH-CN">和</font>Unix<font face="宋体" lang="ZH-CN">风格的版本。</font></span></p>
<p> <span class="normal105"><font face="宋体" lang="ZH-CN">现在,我可以用</font>Perl<font face="宋体" lang="ZH-CN">的</font>XML::Parse<font face="宋体" lang="ZH-CN">模块来解析原稿。在</font>James
Clark <font face="宋体" lang="ZH-CN">的</font>expat ( Mozilla 5<font face="宋体" lang="ZH-CN">中的</font>XML<font face="宋体" lang="ZH-CN">引擎</font>)<font face="宋体" lang="ZH-CN">的基础上,这一新的</font>Perl
<font face="宋体" lang="ZH-CN">模块发展很快</font>;<font face="宋体" lang="ZH-CN">在</font>www.activestate.com
<font face="宋体" lang="ZH-CN">上的</font>Perl-XML<font face="宋体" lang="ZH-CN">邮件列表有详细的讨论。</font>
(<font face="宋体" lang="ZH-CN">如果你在使用</font>ActiveState<font face="宋体" lang="ZH-CN">的新版</font>ActivePerl,
<font face="宋体" lang="ZH-CN">你可以</font>Perl<font face="宋体" lang="ZH-CN">软件包管理器</font>Perl
Package Manager<font face="宋体" lang="ZH-CN">安装该解析器。</font>)<font face="宋体" lang="ZH-CN">这儿说明了如何在</font>Perl<font face="宋体" lang="ZH-CN">中解析</font>XML<font face="宋体" lang="ZH-CN">文档</font>:
</span></p>
<p><span class="normal105">use XML::Parser;<br>
my $xml = XML::Parser->new(Style => 'Stream');<br>
$xml->parsefile("/jon/book/book.htm");</span></p>
<p> <span class="normal105"><font face="宋体" lang="ZH-CN">当你在流方式中使用</font>XML::Parser,<font face="宋体" lang="ZH-CN">解析事件调用</font>Perl<font face="宋体" lang="ZH-CN">方法中</font>StartTag,
EndTag<font face="宋体" lang="ZH-CN">和</font> Text<font face="宋体" lang="ZH-CN">。见<a href="javascript:openWindow1();">表1</a>的实例。</font>StartTag
<font face="宋体" lang="ZH-CN">方法存储当前的标记</font> (<font face="宋体" lang="ZH-CN">如</font>h1)
<font face="宋体" lang="ZH-CN">和属性</font>(<font face="宋体" lang="ZH-CN">如</font>class="chapter")<font face="宋体" lang="ZH-CN">。当</font>Text
<font face="宋体" lang="ZH-CN">方法被调用时</font>—<font face="宋体" lang="ZH-CN">例如,</font>chapter
1 <font face="宋体" lang="ZH-CN">中</font>h1<font face="宋体" lang="ZH-CN">标记的文本</font>
– <font face="宋体" lang="ZH-CN">用所得的信息与章节号给该章的标题添加一个数字。</font>EndTag<font face="宋体" lang="ZH-CN">方法检查内容刚被</font>Text<font face="宋体" lang="ZH-CN">方法释放出的标记是否是应该后续注释链接的标记</font>(<font face="宋体" lang="ZH-CN">如</font>p,li<font face="宋体" lang="ZH-CN">等</font>)<font face="宋体" lang="ZH-CN">。</font> </span></p>
<p><a href="#top"><<返回标题 </a></p>
<font face="宋体" lang="ZH-CN"></font>
<h4><b><font face="宋体" lang="ZH-CN"><a name="2"></a>看,不是</font>DTD!</b></h4>
<p><font face="宋体" lang="ZH-CN"><span class="normal105">请注意</span></font><span class="normal105">expat<font face="宋体" lang="ZH-CN">不是有效性检查的解析器</font>,
XML::Parser<font face="宋体" lang="ZH-CN">也不是。它仅检查一个</font>XML<font face="宋体" lang="ZH-CN">文档是否结构良好</font>(well-formed)
,<font face="宋体" lang="ZH-CN">不必遵循</font>DTD<font face="宋体" lang="ZH-CN">的规定。缺少</font>DTD,
<font face="宋体" lang="ZH-CN">我的脚本从哪儿获取决定何为章节、何为图表或列表的信息?从</font>CSS<font face="宋体" lang="ZH-CN">。也即为,用下面的形式替代虚构的</font>XML<font face="宋体" lang="ZH-CN">化的“我的书”的表示法:</font></span></p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -