解析带DTD文档的XML文件时出错

onlinb41 2006-12-26 09:16:43
我的DTD文档如下:
<!ELEMENT students (student+)>
<!ELEMENT student (Name,Department,Class,Course+)>
<!ATTLIST student ID CDATA #REQUIRED>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Department (#PCDATA)>
<!ELEMENT Class (#PCDATA)>
<!ELEMENT Course (CName,ExamDate,Teacher,CMark,CTime,CType,Score)>
<!ELEMENT CName (#PCDATA)>
<!ELEMENT ExamDate (#PCDATA)>
<!ELEMENT Teacher (#PCDATA)>
<!ELEMENT CMark (#PCDATA)>
<!ELEMENT CTime (#PCDATA)>
<!ELEMENT CType (#PCDATA)>
<!ELEMENT Score (#PCDATA)>

在eclipse里可以生成对应的xml文件:
<?xml version="1.0" encoding="gb2312" standalone="no"?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student ID="103220533">
<Name>学生1</Name>
<Department>计算机系</Department>
<Class>网通班</Class>
<Course>
<CName>Java</CName>
<ExamDate>2006-12-29</ExamDate>
<Teacher>龚根华</Teacher>
<CMark>6</CMark>
<CTime>96</CTime>
<CType>主修</CType>
<Score>88</Score>
</Course>
</student>
</students>

然后我再用DOM对该xml文件进行解析:
DocumentBuilderFactory domfac;
DocumentBuilder docBuilder;
Document doc;
InputStream in;
Element root;
NodeList students;
domfac = DocumentBuilderFactory.newInstance();
try{
docBuilder = domfac.newDocumentBuilder();
in = new FileInputStream("student.xml");
doc = docBuilder.parse(in);
root = doc.getDocumentElement();
students = root.getChildNodes();
............
}catch(ParserConfigurationException e){
e.printStackTrace();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(SAXException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
............

调试时出现如下错误:
org.xml.sax.SAXParseException: Relative URI "student.dtd"; can not be resolved without a base URI.
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3182)
at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3176)
at org.apache.crimson.parser.Parser2.resolveURI(Parser2.java:2758)
at org.apache.crimson.parser.Parser2.maybeExternalID(Parser2.java:2730)
at org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1129)
at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:489)
at org.apache.crimson.parser.Parser2.parse(Parser2.java:305)
at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:442)
at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:185)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:98)
at lin.xml.OperateXML.<init>(OperateXML.java:37)
at lin.xml.OperateXML.main(OperateXML.java:71)
Exception in thread "main" java.lang.NullPointerException
at lin.xml.OperateXML.getDate(OperateXML.java:53)
at lin.xml.OperateXML.main(OperateXML.java:72)

急呀~~~在线等,谢谢高手指点.真的不知道怎么解决此问题.
快~~!!!
...全文
415 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_ville 2007-01-02
  • 打赏
  • 举报
回复
大致的意思是这样的:
Eclipse项目的目录可以设置成源文件和Class文件单独存放(src目录和bin目录),也可以设置成都放在同一目录中。
假如说是前者,源文件放在src目录,Class文件放在bin目录,那么我们命令行执行的时候就要进入到bin目录执行,这个时候所有的其他相关文件都是相对于bin目录来说的,如果你放在项目的根目录里面(即与src和bin目录在同一目录下),命令行就会出错,但是eclipse可能不会出错,因为他的起始目录就是项目的根目录,所以能够保证找到相关的文件。
可以做个简单的测试:
新建一个Java项目,把源文件和Class文件设置成放置在单独的目录里,然后在项目根目录下随便放个文本文件(test.txt),然后写个主类来读这个文件。
// Test.java --
// 2007-01-02 12:18

import java.io.*;

public class Test {

public static void main(String[] args) {
try {
BufferedReader in = new BufferedReader(new FileReader("test.txt"));
String buf;

while((buf = in.readLine()) != null) {
System.out.println(buf);
}
}
catch(FileNotFoundException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
}
}

1. 使用Eclipse运行,可以正确运行,输出文件内容。
2. 命令行运行:抛出FileNotFoundException。
由此可见,两者的运行时上下文是不同的,所以LZ的问题应该也是这一类问题,可能具体不同,但都是由于运行时上下文不同造成的。

反过来,你把test.txt文件放在src目录里面(编译后会在bin目录里),这时来运行,命令行可以正确运行,Eclipse又抛出FileNotFoundException了。

================================
总结:Eclipse的运行时起始目录是Eclipse项目的根目录;命令行的话,当然你在哪个目录下执行命令,哪个目录就是起始目录了。

有问题的话不好意思哈!!!^_^
onlinb41 2007-01-02
  • 打赏
  • 举报
回复
Your XML document makes reference to a DTD through a relative URI or path and
the XML parser is unable to resolve this relative URI from the XML document
path, i.e. relatively to "d:/XMLTest/xml".

There are several solutions to your problem :

1. Simple: Make sure the DTD file can be found locally, relatively to the XML
file path. If necessary, if you are using a stream/reader as input, you can
use SAXBuilder.build(InputStream/Reader, String) or set the System ID in the
SAX InputSource to let the parser know where the XML document actually lies
(this corresponds to setting the "base URI" the parser is asking for).

2. More generic: Implement an org.xml.sax.EntityResolver and register it onto
SAXBuilder to request the parser to delegate to your application the
resolution of enternal entities. That way, you are free to store the DTD files
whereever you wish (e.g. in the application JAR) or manage a cache of
frequently accessed DTDs.

onlinb41 2007-01-02
  • 打赏
  • 举报
回复
谢谢e_ville,现在问题已经解决:
try{
docBuilder = domfac.newDocumentBuilder();
in = new FileInputStream("student.xml");
doc = docBuilder.parse(in);
root = doc.getDocumentElement();
.......

修改为:
try{
docBuilder = domfac.newDocumentBuilder();
url = this.getClass().getResource("student.xml");
doc = docBuilder.parse(new File(url.getFile()));

这样就行了.
现在散分喽!!
onlinb41 2007-01-02
  • 打赏
  • 举报
回复
感谢你的解答,不过,错误好像不是因为这个:
我的eclipse设置的是源代码放在src目录和class文件放在bin目录xml和dtd文件都放在了项目的根目录.但在eclipse是在这行代码的异常导致的:
in = new FileInputStream("./student.xml");
doc = docBuilder.parse(in);
org.xml.sax.SAXParseException: Relative URI "student.dtd"; can not be resolved without a base URI.
我在控制台测试是把所有源文件和xml、dtd文件都放在了同一个目录下,测试通过.
e_ville 2007-01-01
  • 打赏
  • 举报
回复
org.xml.sax.SAXParseException: Relative URI "student.dtd"; can not be resolved without a base URI.

这个应该是没有把DTD和XML文件放在正确的目录下面造成的,在你的XML文件中,类型声明是这样的:<!DOCTYPE students SYSTEM "student.dtd">
所以呢,DTD和XML应该放在同一目录下面。
onlinb41 2007-01-01
  • 打赏
  • 举报
回复
高手们,帮帮忙吧
onlinb41 2007-01-01
  • 打赏
  • 举报
回复
或者,能不能说一下,我该怎么做才不会在eclipse时报错.
onlinb41 2007-01-01
  • 打赏
  • 举报
回复
能不能换一种说法,听不太明白~~呵呵!
非常感谢
e_ville 2007-01-01
  • 打赏
  • 举报
回复
说明:我把所有原文件复制出来,在命令行里可以编译执行,同时也解析出了xml文件里的内容.
=============================
这就没问题了,有Eclipse里会出错,因为Eclipse运行时的起始目录和命令行执行不同!
onlinb41 2007-01-01
  • 打赏
  • 举报
回复
谢谢~~
但是我的xml和dtd文件是在同一层目录里.所以应该不是这个原因~~
说明:我把所有原文件复制出来,在命令行里可以编译执行,同时也解析出了xml文件里的内容.
但同样的原文件在eclipse里就会报这个错!!!!!
请问有什么解决办法??????
onlinb41 2006-12-27
  • 打赏
  • 举报
回复
怎么没人应呀~~~好急哦~~
小弟在此先谢过了
onlinb41 2006-12-26
  • 打赏
  • 举报
回复
哪位高手帮看一下,并没有什么内容,只是一个入门级的错误,但找不到解决办法~~~急呀~~
XML越来越热,关于XML的基础教程网络上也随处可见。可是一大堆的概念和术语往往让人望而生畏,很多朋友问我:XML到底有什么用,我们是否需要学习它?我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。首先有两点是需要肯定的:   第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及学习和了解,等待只会让你失去机会;   第二:新知识肯定会有很多新概念,尝试理解和接受,您才可能提高。不要害怕和逃避,毕竟我们还年轻。   本文共分五大部分。分别是XML快速入门,XML的概念,XML的术语,XML的实现,XML的实例分析。最后附录介绍了XML的相关资源。作者站在普通网页设计人员的角度,用平实生动的语言,向您讲述XML的方方面面,帮助你拨开XML的神秘面纱,快速步入XML的新领域。 • 第一章:XML快速入门 • 一. 什么是XML? • 二. XML是新概念吗? • 三. 使用XML有什么好处? • 四. XML很难学吗? • 五. XML和HTML的区别 • 六. XML的严格格式 • 七. 关于XML的更多 • 第二章:XML概念 • 一. 扩展性 • 二. 标识 • 三. 语言 • 四. 结构化 • 五. Meta数据 • 六. 显示 • 七. DOM • 第三章:XML的术语 • 导言 • 一.XML文档的有关术语 • 二.DTD的有关术语 • 第四章:XML的语法 • 一.XML语法规则 • 二.元素的语法 • 三.注释的语法 • 四.CDATA的语法 • 五.Namespaces的语法 • 六.entity的语法 • 七.DTD的语法 • 第五章:XML实例解释 • 一.定义新标识 • 二.建立XML文档 • 三.建立相应的HTML文件 • 第六章:XML相关资源 五. XML和HTML的区别 XML和HTML都来自于SGML,它们都含有标记,有着相似的语法,HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如表示首行标题,有固定的尺寸。相对的,XML则没有固定的标记,XML不能描述网页具体的外观,内容,它只是描述内容的数据形式和结构。 这是一个质的区别:网页将数据和显示混在一起,而XML则将数据和显示分开来。 我们看上面的例子,在myfile.htm中,我们只关心页面的显示方式,我们可以设计不同的界面,用不同的方式来排版页面,但数据是储存在myfile.xml中,不需要任何改变。 (如果你是程序员,你会惊讶的发现,这与模块化面向对象编程的思想极其相似!其实网页何尝不是一种程序呢?) 正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的数据处理方法,将使网络跨越到一个新的境界。 六. XML的严格格式 吸取HTML松散格式来的经验教训,XML一开始就坚持实行"良好的格式"。 我们先看HTML的一些语句,这些语句在HTML中随处可见: 1. sample 2.sample 3.sample 4.samplar 在XML文档中,上述几种语句的语法都是错误的。因为: 1.所有的标记都必须要有一个相应的结束标记; 2.所有的XML标记都必须合理嵌套; 3.所有XML标记都区分大小写; 4.所有标记的属性必须用""括起来; 所以上列语句在XML中正确的写法是 1. sample 2.sample 3.sample 4.samplar   另外,XML标记必须遵循下面的命名规则: 1.名字中可以包含字母、数字以及其它字母; 2.名字不能以数字或"_" (下划线) 开头; 3.名字不能以字母 xml (或 XML 或 Xml ..) 开头; 4.名字中不能包含空格。 在XML文档中任何的差错,都会得到同一个结果:网页不能被显示。各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都会被报告。你可以将上面的myfile.xml修改一下,比如将改为,然后用IE5直接打开myfile.xml,会得到一个出错信息页面: XML轻松学习手册 ajie
TinyXML是一个简单小巧,可以很容易集成到其它程序中的C++ XML解析器。 它能做些什么 简单地说,TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。 XML的意思是“可扩展标记语言“(eXtensible Markup Language)。它允许你创建你自己的文档标记。在为浏览器标记文档方面HTML做得很好,然而XML允许你定义任何文档标记,比如可以为一个组织者应用程序定义一个描述“to do”列表的文档。 XML拥有一个结构化并且方便的格式,所有为存储应用程序数据而创建的随机文件格式都可以用XML代替,而这一切只需要一个解析器。 最全面正确的说明可以在http://www.w3.org/TR/2004/REC-xml-20040204/找到,但坦白地说,它很晦涩难懂。事实上我喜欢http://skew.org/xml/tutorial上关于XML的介绍。 有不同的方法可以访问和与XML数据进行交互。TinyXML使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。 TinyXML被设计得容易快速上手。它只有两个头文件和四个cpp文件。只需要把它们简单地加到你的项目中就行了。有一个例子文件——xmltest.cpp来引导你该怎么做。 TinyXML以Zlib许可来发布,所以你可以在开源或者商业软件中使用它。许可证更具体的描述在每个源代码文件的顶部可以找到。 TinyXML在保证正确和恰当的XML输出的基础上尝试成为一个灵活的解析器。TinyXML可以在任何合理的C++适用系统上编译。它不依赖于异常或者运行类型信息,有没有STL支持都可以编译。TinyXML完全支持UTF-8编码和前64k个字符实体(译注:如果你不明白这句译文,可能你需要了解一下Unicode编码)。 它无法做些什么 TinyXML不解析不使用DTDs(文档类型定义)或者XSLs(可扩展样式表语言)。有其它解析器(到www.sourceforge.org搜索一下XML)具有更加全面的特性,但它们也就更大,需要花更长的间来建立你的项目,有更陡的学习曲线,而且经常有一个更严格的许可协议。如果你是用于浏览器或者有更复杂的XML需要,那么TinyXML不适合你。 下面的DTD语法在TinyXML里是不做解析的: 因为TinyXML把它看成是一个着非法嵌入!ELEMENT结点的!DOCTYPE结点。或许这在将来会得到支持。 指南 有耐性些,这是一份能很好地指导你怎么开始的指南,它(非常短小精悍)值得你花间完整地读上一遍。 TinyXML指南 代码状况 TinyXML是成熟且经过测试的代码,非常健壮。如果你发现了漏洞,请提交漏洞报告到sourcefore网站上 (www.sourceforge.net/projects/tinyxml)。 我们会尽快修正。 有些地方可以让你得到提高,如果你对TinyXML的工作感兴趣的话可以上sourceforge查找一下。 相关项目 你也许会觉得TinyXML很有用!(简介由项目提供) TinyXPath (http://tinyxpath.sourceforge.net). TinyXPath是一个小巧的XPath语法译码器脚本,用C++写成。 TinyXML++ (http://code.google.com/p/ticpp/). TinyXML++是一个全新的TinyXML接口,使用了许多诸如模板,异常处理和更好的错误处理这些C++强项技术。 特性 使用STL TinyXML可以被编译成使用或不使用STL。如果使用STL,TinyXML会使用std::string类,而且完全支持std::istream,std::ostream,operator<>。许多API方法都有 ‘const char*’和’const std::string&’两个版本。 如果被编译成不使用STL,则任何STL都不会被包含。所有string类都由TinyXML它自己实现。所有API方法都只提供’const char*’传入参数。 使用运行定义: TIXML_USE_STL 来编译成不同的版本。这可以作为参数传给编译器或者在“tinyxml.h”文件的第一行进行设置。 注意:如果在Linux上编译测试代码,设置环境变量TINYXML_USE_STL=YES/NO可以控制STL的编译。而在Windows上,项目文件提供了STL和非STL两种目标文件。在你的项目中,在tinyxml.h的第一行添加"#define TIXML_USE_STL"应该是最简单的。 UTF-8 TinyXML支持UTF-8,所以可以处理任何语言的XML文件,而且TinyXML也支持“legacy模式”——一种在支持UTF-8之前使用的编码方式,可能最好的解释是“扩展的ascii”。 正常情况下,TinyXML会检测出正确的编码并使用它,然而,通过设置头文件中的TIXML_DEFAULT_ENCODING值,TinyXML可以被强制成总是使用某一种编码。 除非以下情况发生,否则TinyXML会默认使用Legacy模式: 如果文件或者数据流以非标准但普遍的"UTF-8引导字节" (0xef 0xbb 0xbf)开始,TinyXML会以UTF-8的方式来读取它。 如果包含有encoding="UTF-8"的声明被读取,那么TinyXML会以UTF-8的方式来读取它。 如果读取到没有指定编码方式的声明,那么TinyXML会以UTF-8的方式来读取它。 如果包含有encoding=“其它编码”的声明被读取,那么TinyXML会以Legacy模式来读取它。在Legacy模式下,TinyXML会像以前那样工作,虽然已经不是很清楚这种模式是如何工作的了,但旧的内容还得保持能够运行。 除了上面提到的情况,TinyXML会默认运行在Legacy模式下。 如果编码设置错误或者检测到错误会发生什么事呢?TinyXML会尝试跳过这些看似不正确的编码,你可能会得到一些奇怪的结果或者乱码,你可以强制TinyXML使用正确的编码模式。 通过使用LoadFile( TIXML_ENCODING_LEGACY )或者LoadFile( filename, TIXML_ENCODING_LEGACY ), 你可以强制TinyXML使用Legacy模式。你也可以通过设置TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY来强制一直使用Legacy模式。同样的,你也可以通过相同的方法来强制设置成TIXML_ENCODING_UTF8。 对于使用英文XML的英语用户来说,UTF-8跟low-ASCII是一样的。你不需要知道UTF-8或者一点也不需要修改你的代码。你可以把UTF-8当作是ASCII的超集。 UTF-8并不是一种双字节格式,但它是一种标准的Unicode编码!TinyXML当前不使用或者直接支持wchar,TCHAR,或者微软的_UNICODE。"Unicode"这个术语被普遍地认为指的是UTF-16(一种unicode的宽字节编码)是不适当的,这是混淆的来源。 对于“high-ascii”语言来说——几乎所有非英语语言,只要XML被编码成UTF-8, TinyXML就能够处理。说起来可能有点微妙,比较旧的程序和操作系统趋向于使用“默认”或者“传统”的编码方式。许多应用程序(和几乎所有现在的应用程序)都能够输出UTF-8,但是那些比较旧或者难处理的(或者干脆不能使用的)系统还是只能以默认编码来输出文本。 比如说,日本的系统传统上使用SHIFT-JIS编码,这种情况下TinyXML就无法读取了。但是一个好的文本编辑器可以导入SHIFT-JIS的文本然后保存成UTF-8编码格式的。 Skew.org link上关于转换编码的话题做得很好。 测试文件“utf8test.xml”包含了英文、西班牙文、俄文和简体中文(希望它们都能够被正确地转化)。“utf8test.gif”文件是从IE上截取的XML文件快照。请注意如果你的系统上没有正确的字体(简体中文或者俄文),那么即使你正确地解析了也看不到与GIF文件上一样的输出。同要注意在一个西方编码的控制台上(至少我的Windows机器是这样),Print()或者printf()也无法正确地显示这个文件,这不关TinyXML的事——这只是操作系统的问题。TinyXML没有丢掉或者损坏数据,只是控制台无法显示UTF-8而已。 实体 TinyXML认得预定义的特殊“字符实体”,即: & & < > " " ' ‘ 这些在XML文档读取都会被辨认出来,并会被转化成等价的UTF-8字符。比如下面的XML文本: Far & Away 从TiXmlText 对象查询出来会变成"Far & Away"这样的值,而写回XML流/文件会以“&”的方式写回。老版本的TinyXML“保留”了字符实体,而在新版本中它们会被转化成字符串。 另外,所有字符都可以用它的Unicode编码数字来指定, " "和" "都表示不可分的空格字符。 打印 TinyXML有几种不同的方式来打印输出,当然它们各有各的优缺点。 Print( FILE* ):输出到一个标准C流中,包括所有的C文件和标准输出。 "相当漂亮的打印", 但你没法控制打印选项。 输出数据直接写到FILE对象中,所以TinyXML代码没有内存负担。 被Print()和SaveFile()调用。 operator<<:输出到一个c++流中。 与C++ iostreams集成在一起。 在"network printing"模式下输出没有换行符,这对于网络传输和C++对象之间的XML交换有好处,但人很难阅读。 TiXmlPrinter:输出到一个std::string或者内存缓冲区中。 API还不是很简练。 将来会增加打印选项。 在将来的版本中可能有些细微的变化,因为它会被改进和扩展。 流 设置了TIXML_USE_STL,TinyXML就能支持C++流(operator <>)和C(FILE*)流。但它们之间有些差异你需要知道: C风格输出: 基于FILE* 用Print()和SaveFile()方法 生成具有很多空格的格式化过的输出,这是为了尽可能让人看得明白。它们非常快,而且能够容忍XML文档中的格式错误。例如一个XML文档包含两个根元素和两个声明仍然能被打印出来。 C风格输入: 基于FILE* 用Parse()和LoadFile()方法 速度快,容错性好。当你不需要C++流就可以使用它。 C++风格输出: 基于std::ostream operator<> 从流中读取XML使其可用于网络传输。通过些小技巧,它知道当XML文档读取完毕,流后面的就一定是其它数据了。TinyXML总假定当它读取到根结点后XML数据就结束了。换句话说,那些具有不止一个根元素的文档是无法被正确读取的。另外还要注意由于STL的实现和TinyXML的限制,operator>>会比Parse慢一些。 空格 对是保留还是压缩空格这一问题人们还没达成共识。举个例子,假设‘_’代表一个空格,对于"Hello____world",HTML和某些XML解析器会解释成"Hello_world",它们压缩掉了一些空格。而有些XML解析器却不会这样,它们会保留空格,于是就是“Hello____world”(记住_表示一个空格)。其它的还建议__Hello___world__应该变成Hello___world 。 这是一个解决得不能让我满意的问题。TinyXML一开始就两种方式都支持。调用TiXmlBase::SetCondenseWhiteSpace( bool )来设置你想要的结果,默认是压缩掉多余的空格。 如果想要改变默认行为,你应该在解析任何XML数据之前调用TiXmlBase::SetCondenseWhiteSpace( bool ) ,而且我不建议设置之后再去改动它。 句柄 想要健壮地读取一个XML文档,检查方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的代码: TiXmlElement* root = document.FirstChildElement( "Document" ); if ( root ) { TiXmlElement* element = root->FirstChildElement( "Element" ); if ( element ) { TiXmlElement* child = element->FirstChildElement( "Child" ); if ( child ) { TiXmlElement* child2 = child->NextSiblingElement( "Child" ); if ( child2 ) { // Finally do something useful. 用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样: TiXmlHandle docHandle( &document ); TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); if ( child2 ) { // do something useful 这处理起来容易多了。 查阅TiXmlHandle可以得到更多的信息。 行列追踪 对于某些应用程序来说,能够追踪节点和属性在它们源文件中的原始位置是很重要的。另外,知道解析错误在源文件中的发生位置可以节省大量间。 TinyXML能够追踪所有结点和属性在文本文件中的行列原始位置。TiXmlBase::Row() 和 TiXmlBase::Column() 方法返回结点在源文件中的原始位置。正确的制表符号可以经由TiXmlDocument::SetTabSize() 来配置。 使用与安装 编译与运行xmltest: 提供了一个Linux Makefile和一个Windows Visual C++ .dsw 文件。只需要简单地编译和运行,它就会在你的磁盘上生成demotest.xml文件并在屏幕上输出。它还尝试用不同的方法遍历DOM并打印出结点数。 那个Linux makefile很通用,可以运行在很多系统上——它目前已经在mingw和MacOSX上测试过。你不需要运行 ‘make depend’,因为那些依赖关系已经硬编码在文件里了。 用于VC6的Windows项目文件 tinyxml: tinyxml 库,非STL tinyxmlSTL: tinyxml 库,STL tinyXmlTest: 用于测试的应用程序,非STL tinyXmlTestSTL: 用于测试的应用程序,STL Makefile 在makefile的顶部你可以设置: PROFILE,DEBUG,和TINYXML_USE_STL。makefile里有具体描述。 在tinyxml目录输入“make clean”然后“make”,就可以生成可执行的“xmltest”文件。 在某一应用程序中使用: 把tinyxml.cpp,tinyxml.h, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.cpp, 和 tinystr.h 添加到你的项目和makefile中。就这么简单,它可以在任何合理的C++适用系统上编译。不需要为TinyXML打开异常或者运行类型信息支持。 TinyXML怎么工作 举个例子可能是最好的办法,理解一下: Go to the Toy store! Do bills 它称不上是一个To Do列表,但它已经足够了。像下面这样读取并解析这个文件(叫“demo.xml”)你就能创建一个文档: TiXmlDocument doc( "demo.xml" ); doc.LoadFile(); 现在它准备好了,让我们看看其中的某些行和它们怎么与DOM联系起来。 第一行是一个声明,它会转化成TiXmlDeclaration 类,同也是文档结点的第一个子结点。 这是TinyXML唯一能够解析的指令/特殊标签。一般来说指令标签会保存在TiXmlUnknown 以保证在它保存回磁盘不会丢失这些命令。 这是一个注释,会成为一个TiXmlComment对象。 "ToDo"标签定义了一个TiXmlElement 对象。它没有任何属性,但包含另外的两个元素。 生成另一个TiXmlElement对象,它是“ToDo”元素的子结点。此元素有一个名为“priority”和值为“1”的属性。 Go to the TiXmlText ,这是一个叶子结点,它不能再包含其它结点,是"Item" TiXmlElement的子结点。 另一个TiXmlElement, 这也是“Item”元素的子结点。 等等 最后,看看整个对象树: TiXmlDocument "demo.xml" TiXmlDeclaration "version=’1.0′" "standalone=no" TiXmlComment " Our to do list data" TiXmlElement "ToDo" TiXmlElement "Item" Attribtutes: priority = 1 TiXmlText "Go to the " TiXmlElement "bold" TiXmlText "Toy store!" TiXmlElement "Item" Attributes: priority=2 TiXmlText "Do bills" 文档文档由Doxygen使用‘dox’配置文件生成。 许可证 TinyXML基于zlib许可证来发布: 本软件按“现状”提供(即现在你看到的样子),不做任何明确或隐晦的保证。由使用此软件所引起的任何损失都决不可能由作者承担。 只要遵循下面的限制,就允许任何人把这软件用于任何目的,包括商业软件,也允许修改它并自由地重新发布: 1. 决不能虚报软件的来源;你决不能声称是你是软件的第一作者。如果你在某个产品中使用了这个软件,那么在产品文档中加入一个致谢辞我们会很感激,但这并非必要。 2. 修改了源版本就应该清楚地标记出来,决不能虚报说这是原始软件。 3. 本通告不能从源发布版本中移除或做修改。 参考书目 万维网联盟是定制XML的权威标准机构,它的网页上有大量的信息。 权威指南:http://www.w3.org/TR/2004/REC-xml-20040204/ 我还要推荐由OReilly出版由Robert Eckstein撰写的"XML Pocket Reference"……这本书囊括了入门所需要的一切。 捐助者,联系人,还有简史 非常感谢给我们建议,漏洞报告,意见和鼓励的所有人。它们很有用,并且使得这个项目变得有趣。特别感谢那些捐助者,是他们让这个网站页面生机勃勃。 有很多人发来漏洞报告和意见,与其在这里一一列出来不如我们试着把它们写到“changes.txt”文件中加以赞扬。 TinyXML的原作者是Lee Thomason(文档中还经常出现“我”这个词) 。在Yves Berquin,Andrew Ellerton,和tinyXml社区的帮助下,Lee查阅修改和发布新版本。
可扩展标记语言 科技名词定义 中文名称: 可扩展标记语言 英文名称: extensible markup language;XML 定义: 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 应用学科: 地理学(一级学科);地理信息系统(二级学科) 以上内容由全国科学技术名词审定委员会审定公布 百科名片 可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。 目录 格式特性 简明语法 编辑本段格式特性   XML与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是展示数据。事实上XML与其他数据表现形式最大的不同是:他极其简单。这是一个看上去有点琐细的优点,但正是这点使XML与众不同。   XML与HTML的设计区别是:XML是用来存储数据的,重在数据本身。而HTML是用来定义数据的,重在数据的显示模式。   XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其它的数据交换格式,但不久之后他们都将支持XML,那就意味着程序可以更容易的与Windows,Mac OS,Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析他,并以XML格式输出结果。   为了使得SGML显得用户友好,XML重新定义了SGML的一些内部值和参数,去掉了大量的很少用到的功能,这些繁杂的功能使得SGML在设计网站显得复杂化。XML保留了SGML的结构化功能,这样就使得网站设计者可以定义自己的文档类型,XML同也推出一种新型文档类型,使得开发者也可以不必定义文档类型。 编辑本段简明语法   SGML常用来定义针对HTML的文档类型定义(DTD),同它也常用于编写XML的DTD。SGML的问题就在于,它允许出现一些奇怪的语法,这让创建HTML的解析器成为一个大难题:   1 某些起始标签不允许出现结束标签,例如HTML中标签。包含了结束标签就会出现错误。   2 某些起始标签可以选择性出现结束标签或者隐含了结束标签   3 某些起始标签要求必须出现结束标签,例如HTML中[removed]标签。   4 标签可以以任何顺序嵌套。即使结束标签不按照起始标签的逆序出现也是允许的,例如,This is a sample string是正确的。   5 某些特性要求必须包含值,例如中的src特性。   6 某些特性不要求一定有值,例如中的nowrap特性。   7 定义特性的两边有没有加上双引号都是可以的,所以都是允许的。   这些问题使建立一个SGML语言的解析器变成了一项艰巨的任务。判断何应用以上规则的困难导致了SGML语言的定义一直停滞不前。以这些问题作为出发点,XML逐渐步入我们的视野。   XML去掉了之前令许多开发人员头疼的SGML的随意语法。在XML中,采用了如下的语法:   1 任何的起始标签都必须有一个结束标签。   2 可以采用另一种简化语法,可以在一个标签中同表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如。XML解析器会将其翻译成。   3 标签必须按合适的顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,例如this is a samplestring。这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。   4 所有的特性都必须有值。   5 所有的特性都必须在值的周围加上双引号。   这些规则使得开发一个XML解析器要简便得多,而且也除去了解析SGML中花在判断何何地应用那些奇怪语法规则上的工作。仅仅在XML出现后的前六年就衍生出多种不同的语言,包括MathML、SVG、RDF、RSS、SOAP、XSLT、XSL-FO,而同也将HTML改进为XHTML。 WEB技术 HTML HTML ▪ XHTML ▪ HTML 5 ▪ CSS ▪ TCP/IP XML XML ▪ XSL ▪ XSLT ▪ XSL-FO ▪ XPath ▪ XPointer ▪ XLink ▪ DTD ▪ XML Schema ▪ DOM ▪ XForms ▪ SOAP ▪ WSDL ▪ RDF ▪ RSS ▪ WAP ▪ Web Services Web脚本 JavaScript ▪ HTML DOM ▪ DHTML ▪ VBScript ▪ AJAX ▪ jQuery ▪ JSON ▪ E4X ▪ WMLScript Serv脚本 SQL ▪ ASP ▪ ADO ▪ PHP .NET Microsoft.NET ▪ ASP.NET ▪ .NET Mobile 多媒体 SMIL ▪ SVG 扩展阅读: 1 因为XML是W3C制定的,XML的标准化工作由W3C的XML工作组负责,该小组成员由来自各个地方和行业的专家组成,他们通过email交流对XML标准的意见,并提出自己的看法 (www.w3.org/TR/WD-xml)。因为XML 是个公共格式, (它不专属于任何一家公司),你不必担心XML技术会成为少数公司的盈利工具,XML不是一个依附于特定浏览器的语言。
前 言可扩展标记语言(Extensible Markup Language, XML)作为一种计算技术出现不过是短短几年前的事情。它是一种概念,以其简便性而颇得人心,它驱动了Internet应用程序编写方式的动态改变。本书的覆盖范围本书解释和演示了设计、使用、显示XML文档所必需的技术。首先也是最重要的,本书覆盖了万维网协会(W3C)整理编撰的XML的全部基础内容。W3C是以正统方式发明XML的标准主体并在不断开发XML的规范。虽然有越来越多的XML社团在不断涌现并提出崭新的超出W3C控制之外的与XML相关的想法,但W3C对于XML的开发来说,仍然是非常重要并处于中心地位的。本书的焦点集中在如何使XML与现实生活中的应用结合在一起。它展示了很好的设计技术,演示了如何在支持XML的应用程序与Web应用程序和数据库系统之间提供接口。它研究了XML的尖端部分并预览了一些新兴技术。不管你的需要是针对数据交换还是显示样式化,本书都会覆盖XML领域的所有相关技术。本书中的每一章都包含一个实践范例。由于XML是一种独立于平台的技术,所有这些例子覆盖了各种语言、解析器和服务器。所有的技术都与所有的平台有着某种关系,所以即便它们不是在你最习惯的平台上实现的,你仍然可以从这些例子中得到许多有益的知识。本书的读者群本书适用于任何希望使用XML构建应用程序和系统的读者。Web站点的开发者能够学到把自己的站点提高一个层次的技术,而编程者和软件系统程序员能够学到XML如何和他们的系统相配合,以及如何使用它来解决应用程序集成中的问题。 XML应用程序天生就具备分布性而且通常是面向Web的。本书并不是一本专注于分布式系统或Web开发的著作,所以你不必深入了解这些领域的内容。大概了解Web中的多层结构和网络互联就已经足够了。本书中的样例使用了各种各样的编程语言和技术。XML之所以吸引人,很重要的一点就在于它是独立于平台和语言的。如果你做过一些Web开发,肯定会发现其中的某些例子你曾经用自己偏爱的语言编写过。如果你没有发现针对自己的平台的任何例子,也不要担心。用于XML的工具已经有了Perl、C++、Java、JavaScript和任何支持COM的语言版本。Microsoft Internet Explorer(主要是5.0或更新的版本)拥有很强的XML内置功能,而Mozilla浏览器也有类似的支持。XML工具还深入到了主要的关系型数据库管理系统,以及Web和应用程序服务器当中。如果本书没有涉及到你的平台,学习XML的基础并掌握例子中所包含的技术,就能够把学到的经验应用到任何普通的计算平台上。本书的组织结构本书的每一章都有一个关于XML的单独主题。第1章提供了XML主要特点的概念性介绍。第2章和第3章关系非常密切,因为它们都涉及XML的基础。第2章涉及XML的基本语法和规则。第3章提供了正式定义针对自己特定问题的XML词汇表的工具。但是,此后的章节因本身介绍的技术和技巧的不同相对非常独立。本书的主要章节是和一个统一的例子紧密相关的。这个例子假设一个出版商希望用XML表单显示自己的数据目录。开始,我们设计出目录中书籍的描述规则,然后构建那些规则逐个演示每种技术是如何帮助我们构建XML应用程序的。你将看到书籍目录如何转变成文档,每个文档如何用代码操作和访问,它们的内容如何样式化以便于人们阅读。既然从实践来说,这类应用程序不可能凭空存在,所以我们将看到XML应用程序如何与数据库接口。这些是贯穿全书的、在此后的章节中将重点突出的几个主线。这使得你能够在通读全书把注意力集中在那些对于你非常重要的问题上,而跳过其他章节。学习主线 XML是从一种简单的文档标记语言逐步发展成为涉及范围广泛的标记技术的。这种成长也正是XML应用程序的强大所在。但是,随着这种成长也出现了分歧。不同的读者可能会抱着不同的期待来阅读本书。XML对于不同的人来说是完全不同的事情。虽然我们希望大家能够逐章地阅读全书,但这并不是必须的。实际上,对于任何接触本书的人来说这都不是最好的方式。本书是由从一个核心辐射出去的三个主线组成的。读者当然可以从第1章开始,然后按顺序逐章阅读到最后一章,但读者也可以根据自己的需要找到一个更为直接的途径。每个人应该阅读本书的核心章节以理解XML包含的基本内容。以此作为开始,你可以从数据的角度或者从内容的可视化和样式化这个角度来了解XML。 1. 核心第2章(XML)和第3章(DTD)覆盖了XML 1.0的基础内容。第2章给了我们基本语法概念,第3章告诉我们如何以一种每个XML编程者都能够理解的方式正规地定义XML词汇表。这些章节提供了理解和使用XML所必需的最基本内容。第4章(关于数据建模)在创建良好的XML结构方面为读者提供了有效的指导和经验。从一个不佳的XML词汇表中恢复过来是非常困难的,而好的结构将免除许多编程错误。第5章向大家讲解了文档对象模型(DOM),W3C用于XML文档的API,以及其他诸多事物。这将引导大家走出文档的范畴进入应用程序的世界。这四章对于读者开始XML应用程序的编程来说已经足够了。当你读完它们之后,你将理解XML是什么,如何筹划它的结构,如何用代码操作XML文档。虽然XML技巧资源已经相当丰富,但你仍需要首先打好坚实的基础。所以关键的主线包括: ?第2章:格式正规的XML ?第3章:文档类型定义 ?第4章:数据建模 ?第5章:文档对象模型 2. 作为数据的XML 正如你在核心章节中看到的,XML和HTML不同,它清晰划分出文档内容和可视化显示两个部分。实际上,从许多应用程序的目的出发,XML文档的可视化显示并不重要。这些应用程序把XML看作是数据。它的意思就是把XML当作程序和系统之间的接口使用。这可能是现在XML最令人振奋的特征—特别是XML能够使电子商务成为从事商务交易处理的Web应用程序的一种技术。第6章将从这一线索开始。它讨论了一种用于操作XML文档的由事件驱动的API(被称作SAX)。这种API对于处理大容量的XML、XML流或者你在解析器中留下最少的痕迹的候特别有用。第7章介绍了命名空间和模式,这两个领域使我们能够以比DTD更有效和更富有创造性的方式来表达概念。它们是XML中描述数据的核心。第8章向大家演示了如何链接文档和在文档中针对特定元素进行查询。在本书样例中使用的查询技术实际起源于XML的样式化,所以本章还承当了显示主线的双重重任。它在这条主线中对于展示查询如何快速找到所需元素,以及如何将不同XML文档关联起来非常有用。第9章(操作XML)也涵盖了出于各类目的转换XML文档的种种技术。从数据的角度讲这非常有趣,因为它展示了一些在词汇表之间转化的非常强大的技术。我们将证明,对于数据交换,特别是在电子商务和B2B的环境下,它是非常有用的。此外,本章也会涉及到显示主线,因为它介绍了将XML文档转换为其他语言的思想,这是有助于向用户显示XML内容的。第10章(XML和数据库)全是关于数据的。关系型数据库和XML是获取数据用于计算的两种途径,但是它们所扮演的角色不同。本章将教会大家如何在传统方法和数据存储之间提供接口以便于XML的使用。第11章(服务器到服务器)将介绍当我们无法从本地得到数据如何到达另外一个服务器。这种新奇的技巧将变得越来越普通,因为Web应用程序正逐渐走向计算技术的前台。接下来,第12章会利用前两章的信息来讨论XML如何作为电子商务的信息媒介来使用。在这个例子中,另一台服务器属于一个商业合作伙伴。他们会根据具体情况利用XML解决数据交换的问题并说明具体细节。这条主线的一个题外话就是对无线应用协议(Wireless Application Protocol, WAP)的讨论,它与第14章中XML在无线标记语言(Wireless Markup Language, WAL)中的使用有着关系。WAP所关心的大部分内容是如何把XML的冗长形式变形为简练的二进制表示,在不失去以往优势的同也适合移动设备使用。考虑这个问题并了解WAP的解决方案会使我们更加感叹XML作为数据交换介质的优势。此外,如果XML用来存储和传输数据,我们可能希望把自己数据放到所有的普通数据设备上,而越来越多的无线设备(例如蜂窝电话和专用Web设备)会成为我们的选择。所以XML作为数据的这条主线包括:第6章:SAX:XML的简单API 第7章:命名空间和模式第8章:链接和查询第9章:操作XML 第10章:XML和数据库第11章:服务器到服务器第12章:电子商务第14章:WAP和WML 3. XML的可视化显示 XML的数据处理对于在机器之间移动数据来说是再好不过了,但是如果你要把XML传递给人的话,就会对它的样式处理比较感兴趣。和大多数注重于数据的传统计算领域(例如关系型数据库)不同,XML的研究者们在如何显示数据方面花费的心思相当地少。XML的解决方案都是数据驱动型的。不管我们使用的是CSS还是XSL,我们将样式单中的数据应用到XML文档中的数据上,以产生适合人们阅读的可视化显示。第8章(链接和查询)将以此为线索开始。这是因为查询技术的一个子集允许编程者指定一个标准集,用来选择文档中必须样式化的部分。样式化要精确到能够指定如何根据特定元素所处位置的上下文关系来实现。相同类型的元素可能因为它们父元素的不同,或者周边显示的不同而以不同的面貌出现在大家面前。第9章将告诉编程者根据适当的环境,在需要把XML转换成适合显示的某些其他格式的技术。这正是数据驱动的样式化的核心所在。第13章(样式化)在第8章和第9章的基础上告诉读者如何对XML样式化。我们的样式单将成为强大的规则集合,能够应用于XML文档的数据以产生可视化的显示。从一个数据集,你可以快速而有效地产生用于显示的多种视图。这就是把数据与显示实现分离开来的好处。第14章(WAP)也包含在显示主线当中,因为样式化对于小型设备来说是一种很重要的选择,而小型设备是无线通信的主要用户。它帮助设计者解决如何压缩可视化内容以适应非常小的显示区域。这就将数据副本的考虑和数据压缩结合在了一起,以适合低宽的网络使用。因为我们的样式是由样式单驱动而不是嵌入在数据当中的,所以我们能够专门针对无线设备创建一种有效的显示格式。总而言之,我们的显示主线包括:第8章:链接和查询第9章:操作XML 第13章:样式化第14章:WAP 阅读本书前的准备本书假设你已经掌握了一些关于HTML、JavaScript、Java和ASP的知识。如果你不熟悉Java或ASP,它并不会妨碍你了解隐含在主题后面的概念,它们的影响会限制在一个较小的范围内。但是,为了能够使用本书中提到的所有样例,你必须得有一个浏览器,一个兼容ASP的Web服务器(例如Microsoft的Personal Web Server)并(作为运行Java程序的最小环境)安装Sun Java运行环境(JRE)。 Personal Web Server(用于Windows 9x机器)可以作为NT4 Option Pack的一部分免费下载: http://www.microsoft.com/ntserver/nts/downloads/recommended/NT4OptPk/default.asp 在同样的地址你可以下载IIS for Windows NT 4。Windows 2000 Professional预装了支持ASP的Web服务器,但是你需要从定制安装中进行选择,而不能采用典型安装。 JRE能够从以下地址免费得到: http://www.java.sun.com/products/jdk/1.2/jre/index.html 本书涉及代码的全部内容都可以从http://www.wrox.com下载。约定为了帮助大家熟悉结构,理解全文,我们使用许多贯穿全书的约定。书中的程序底纹的是一些新的、重要的,而不底纹的是相对而言不太重要,或前面遇到过的。在正文当中,当我们介绍到重要词汇,会突出显示。当我们介绍键盘组合,会采用这种形式:Ctrl-A。保持联络如果大家能够对本书提出宝贵的意见和建议,我们将不胜感激。我们的电子邮件地址是: feedback@wrox.com 大家也可以通过反馈链接和我们联络: http://www.wrox.com 本书原书书号为ISBN 1-861003-11-0。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧