Martin C. Brown (questions@mcslp.com), 开发人员和作家
2008 年 6 月 16 日
使用本文介绍的 10 个技巧更加轻松地处理 XML,从而减少错误并提高效率。
简介
人们都很喜欢 XML 以及它所提供的灵活性和互操作性,但是,通过使用一些技巧,可以使与 XML 的互操作和与 XML 一起使用的工具更加简单。在处理 XML 时养成一些良好的习惯可以保证最高效地利用您的 XML 文档和应用程序。
使用 10 种良好的习惯
以下是 10 种最良好的 XML 习惯:
定义 XML 和编码
使用 DTD 或 XSD
记得进行验证
验证并不总是能够解决问题
XML 结构和属性
使用 XPath 查找信息
并不总是需要使用解析器提取信息
何时使用 SAX 而非 DOM 解析
何时使用 DOM 而非 SAX 解析
使用良好的 XML 编辑器
经常使用的缩写词
DOM:文档对象模型(Document Object Model)
DTD:文档类型定义(Document Type Definition)
HTML:超文本标记语言(Hypertext Markup Language)
IDE:集成开发环境(Integrated Development Environment)
SAX:XML 简单 API(Simple API for XML)
XSD:XML 模式定义(XML Schema Definition)
XML:可扩展标记语言(Extensible Markup Language)
XSLT:可扩展样式表语言转换(Extensible Stylesheet Language Transformations)
定义 XML 和编码
在快速创建 XML 文档时,一般都会倾向于创建基本的结构并避开一些普通 XML 文档需求,包括指定 XML 文档声明和 XML 文档包含的数据的编码类型。
考虑清单 1 所示的 XML 文档。
清单 1. 未包含 XML 声明和数据编码类型的 XML 文档
<phrases>
<phrase lang="en">Hello</phrase>
<phrase lang="it">Buongiorno</phrase>
<phrase lang="fr">Salut!</phrase>
</phrases>
|
对于普通人来说,可以查看该文档并将其识别为 XML,但是对于计算机来说,则很难作出这样的判断。在文件顶部添加 XML 声明,可以使它更加明确、更容易识别。一行简单的代码就可以说明文档是 XML,并且指出版本号和 XML 数据使用的字符编码类型。例如:
<?xml version="1.0" encoding="us-ascii"?>
|
编码说明中的内容也应该确保正确性。XML 解析器使用编码确保 XML 文档的单个字符被正确载入。例如,继续 清单 1 中基于短语的示例,如果向文档添加一个俄语条目,则会出现问题,因为目前指定的编码不支持扩展的字符集(使用俄语短语表示 hello 时要求使用扩展字符集)。
指定错误的编码意味着解析器不能正确处理文档;例如,如果将一个多字节扩展字符读取为一个单字节组成的序列,那么会导致数据的损坏和不良输出。
使用 DTD 或 XSD
添加了 XML 声明后,应该确保使用 DTD 或 XSD 定义有效的 XML 文件的结构。这两种方法都允许 XML 解析器检查并确定 XML 文件的内容与建模数据对应的结构相匹配。
例如,给出一个针对联系(contact)数据库的简单 XML 结构,您希望定义一种结构来指定联系人的姓名、地址和电话号码。使用 DTD 方法可以使您映射这种结构并确保结构中的每一个联系人与布局相匹配。
例如,清单 2 中显示了针对联系数据库的 DTD。
清单 2. 用于联系数据库的 DTD
<!ELEMENT phone (#PCDATA)>
<!ATTLIST phone type (home | work | mobile) #REQUIRED>
<!ELEMENT contact (#PCDATA | name | phone | address)*>
<!ELEMENT contacts (#PCDATA | contact)*>
<!ELEMENT country (#PCDATA)>
<!ELEMENT road (#PCDATA)>
<!ELEMENT address (#PCDATA | road | city | state | postcode | country)*>
<!ATTLIST address type (home | work) #REQUIRED>
<!ELEMENT state (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT postcode (#PCDATA)>
<!ELEMENT city (#PCDATA)>
|
DTD 定义了描述联系人所需要的元素、属性(以及这些属性所支持的值)。例如,在 清单 2 可以看到,phone 元素有一个 type 属性,而 address 和其中的 component 元素也有属性。
使用 DTD 可以帮助确保属性的有效性,并且,和验证过程一起使用时可以识别任何问题。当和支持 XML 的编辑器一起使用时,DTD 可以帮助编辑和自动完成内容。
XSDs,即模式,可以执行很多与 DTD 相同的功能,但有其独特的用途。例如,一些 XML 编辑器需要使用 DTD 自动完成内容,然而模式在设计文档实际层次结构方面更加灵活。您可以根据具体环境选择工具。
记得进行验证
查看清单 3,能否找出其中的问题?
清单 3. 验证示例
<contacts>
<contact>
<name>Martin</name>
<phone type="home">123 456 7890</phone>
<phone type="mobile">123 456 7890</phone>
<phone type="work">123 456 7890</phone>
<address type="home">
<road>Home road</road>
<city>Home city</city>
<state>Home state</state>
<zipcode>12434</zipcode>
<country>USA</country>
</address>
</contact>
<contact>
<name>Sharon</name>
<phone type="work">234 567 8901</phone>
<phone>234 567 8901</phone>
<address type="home">
<road>Other home road</road>
<city>Other city</city>
<state>Other state</state>
<zipcode>39487</zipcode>
<country>USA</country>
</address>
<address type="work>
<road>Work building, work road</road>
<city>Work city</city>
<state>Work state</state>
<zipcode>12347</zipcode>
<country>USA</country>
</address>
</contact>
</contacts>
|
手动查找问题非常麻烦。但是可以通过 xmllint(一款可以检验 XML 文件的内容和结构的免费工具)运行文件,您可以查看运行该文件的输出,如清单 4 所示。
清单 4. 通过 xmllint 运行清单 3 得到的输出
$ xmllint contacts.xml
contacts.xml:27: parser error : Unescaped '<' not allowed in attributes values
<road>Work building, work road</road>
^
contacts.xml:27: parser error : attributes construct error
<road>Work building, work road</road>
^
contacts.xml:27: parser error : Couldn't find end of Start Tag address line 26
<road>Work building, work road</road>
^
contacts.xml:32: parser error : Opening and ending tag mismatch: contact line 15
and address
</address>
^
contacts.xml:33: parser error : Opening and ending tag mismatch: contacts line 1
and contact
</contact>
^
contacts.xml:34: parser error : Extra content at the end of the document
</contacts>
|
尽管与最初的问题(其中的一个属性没有结束)相比似乎复杂了很多,但却为您查找问题提供了一个起点。
xmllint 还支持各种各样的命令行选项,帮助选择诊断方法和结果。其中最有用的一个选项是 --noout,它阻止 xmllint 在解析文件时回传内容。对于较短的文件来说没有什么影响,但对于大型文件来说则是一个问题。
如果正在使用 DTD,那么使用 --postvalid 选项告诉 xmllint 针对 DTD 验证内容,确保内容不仅是有效的 XML,而且还与 DTD 的结构相匹配。如果将 使用 DTD 或 XSD 为 contact 文件生成的 DTD 添加到文件,那么属性定义错误将被纠正,但随后将生成一个不同的错误,如清单 5 所示。
清单 5. xmllint 找到不同的错误
$ xmllint --noout --postvalid contacts.xml
contacts.xml:9: element address: validity error : Element zipcode is not declared
in address list of possible children
contacts.xml:21: element address: validity error : Element zipcode is not declared
in address list of possible children
contacts.xml:28: element address: validity error : Element zipcode is not declared
in address list of possible children
Document contacts.xml does not validate
|
这样使用 xmllint 可以方便快捷地确定文档的结构是否有效。xmllint 是 libxml2 工具箱的一部分,该工具箱已绑定到 Linux、UNIX® 和 Mac OS X,但 Windows® 需要独立下载。有关 xmllint 和 libxml2 的更多信息,请参见 参考资料。
验证并不总是能够解决问题
使用 xmllint 和类似工具验证 XML 文件(特别是如果使用了 DTD),是验证 XML 文件内容的很好方法。然而,这种方法也有其局限性。例如,如何处理 XML 文件的内容?
使用 DTD 或 XSD,您可以为属性指定明确的内容。您只是创建了带有一个字符串或 ID 的属性(可以是受限制的可用选项列表的一部分),但是不能使用这种方式控制或限制元素的内容。
例如,在联系人示例中,telephone numbers 元素包含数字和空格。但是没办法阻止用户向该元素添加字母字符。这样做在使用 xmllint 进行验证时不会检查出错误,并且编辑器和其他支持 XML 的解决方案也无法解决或识别这个问题。应用程序出现的故障可能和您预料的一样,因为它识别出一个非标准数据类型。
简而言之,XML 验证只能保证结构正确,而无法保证数据的有效性。
解决此问题的最简单方法是编写一个解析器,它可以读取 XML 文件并实际验证数据内容。但是不要过度地验证内容,只需确保数据符合应用程序的要求。
XML 结构和属性
对于究竟是使用属性还是元素来描述希望在 XML 文件中呈现的信息,人们存在着不同的看法。
一般的做法是,使用元素(即标记之间的数据)定义文件包含的信息,而属性则用于提供所描述数据的扩展限制。
元素和属性都各有弊端。例如,属性不能够在标记中重复,这是元素优于属性的典型例子。元素支持重复信息的能力使其非常实用。相反,使用元素限制数据有时处理起来会比较复杂。
联系人示例中的电话号码很好地解释了属性的优点。在这个示例中,如清单 6 所示,使用属性限制电话号码的类型(例如办公、住宅或移动电话)。
清单 6. 限制电话号码的类型
<phone type="home">123 456 7890</phone>
<phone type="mobile">123 456 7890</phone>
<phone type="work">123 456 7890</phone>
|
使用这种结构,能够轻松地把号码作为一个整体(忽略属性),或者挑选特定的电话号码类型(使用属性)。
将此结构与清单 7 中只使用元素设计的结构进行比较。
清单 7. 只使用元素限制电话号码
<phone>
<type>home</type>
<number>123 456 7890</number>
</phone>
<phone>
<type>mobile</type>
<number>123 456 7890</number>
</phone>
<phone>
<type>work</type>
<number>123 456 7890</number>
font-fa
分享到:
Global site tag (gtag.js) - Google Analytics
|
|
相关推荐
2. **示例代码**:库中通常会包含示例代码,展示如何使用mini-XML解析和操作XML文档,帮助开发者快速学习和应用。 3. **文档支持**:良好的库文档是关键,mini-XML应该有详细的技术文档,解释每个函数的作用和用法...
在.NET编程环境中,XML文件常用于数据存储和交换,因为它具有结构清晰、易于解析的特点。...通过这个实例,开发者可以学习到XML解析、数据绑定、以及第三方库的使用,这些都是日常开发中非常实用的技能。
此外,为了提高代码的可维护性和可读性,良好的编程习惯和代码组织也是必不可少的,例如遵循命名规范、编写注释以及合理地使用类和方法。 总的来说,【Java+XML通讯录】项目是一个综合性的编程练习,涵盖了Java编程...
学习主线 XML是从一种简单的文档标记语言逐步发展成为涉及范围广泛的标记技术的。这种成长也正是XML应用程序的强大所在。但是,随着这种成长也出现了分歧。不同的读者可能会抱着不同的期待来阅读本书。XML对于不同的...
- 在实际开发中,应遵循良好的编程习惯,如使用命名约定、注释代码、编写单元测试等,确保代码质量。 10. **总结**: - “c#源码treeview xml应用”涵盖了C#中数据可视化、XML处理、分页技术以及面向对象的设计...
《韩顺平.第二版java视频教程.XML.课堂习题》是一套专注于Java编程和XML...通过系统地学习并完成习题,学习者不仅可以掌握这两种关键技术,还能培养良好的编程习惯和问题解决能力,为未来的职业发展打下坚实的基础。
* 良好的编程习惯:使用适合的 XML 处理函数、避免 XML 错误 * 常见编程错误:XML 处理错误、解析错误 15. 数据库应用程序编程接口(DB-API) * 知识点:DB-API 的概念、DB-API 的应用 * 良好的编程习惯:使用...
在开发过程中,应注重代码的可读性和可维护性,遵循良好的编程习惯,如使用注释、遵循命名规范以及模块化设计。同时,为了确保数据安全,还应该考虑异常处理和数据验证。 总的来说,这个基于Java和XML的成绩管理...
在C#编程过程中,遵循良好的编码习惯对于提高代码质量和团队协作至关重要。下面将详细介绍文档中提到的关键知识点。 #### 1. 文件组织 - **每个类一个文件**:为了便于管理和维护,建议每个类定义在一个单独的文件...
9. **软件工程实践**:遵循良好的编程习惯,编写注释,组织代码结构,进行单元测试等。 对于学习者来说,这个项目提供了一个实践Java和XML处理的机会,同时也可以了解RSS阅读器的工作原理,增强对网络数据获取和...
XML Explorer是基于Windows的Win32 API开发的,这意味着它在Microsoft Windows操作系统上运行良好,支持各种Windows版本。MFC(Microsoft Foundation Classes)是微软提供的一套面向对象的C++类库,用于简化Windows...
4. **个性化推荐**:通过算法分析用户的学习习惯和偏好,推送相关的学习内容,提高学习效率。 5. **实时更新与同步**:随着新的学习资料不断发布,软件需要支持内容的即时更新,并确保用户在不同设备间的同步学习...
XML(Extensible Markup Language)是一种标记语言,它被用来存储和传输结构化数据。在这个场景中,XML文件可能包含了中国所有省份、城市和区县的层次结构数据,例如: ```xml 北京市 北京市市辖区 东城区 ......
【知识点详解】 在这个“我学习的心得”中,主要涉及的是安卓应用开发,特别是构建一个MP3播放器项目。以下是对各个部分的详细说明: ...同时,也强调了良好的编程习惯,如使用常量代替数字,以及正确处理文件编码。
深度学习图像标注工具软件是专为计算机视觉领域设计的一款实用工具,主要用于协助研究人员和开发者进行目标检测数据的标注工作。...同时,遵循良好的数据管理习惯,如定期备份,可以避免潜在的数据丢失风险。
XHTML的严格规则有助于培养良好的编码习惯,这对于后续学习这些技术至关重要。 学习XHTML不需要HTML的基础,但如果你已经熟悉HTML,过渡到XHTML会更加顺畅。学习过程可以通过阅读教程、实践编程以及分析现有网站的...
【北大青鸟J学士后Java基础课程学习资料】是一套专门为初学者设计的Java编程教育材料,由知名教育机构北大青鸟推出。...通过这些资料的学习,学员不仅可以掌握Java编程,还能培养良好的编程习惯和问题解决能力。