Microsoft PowerPoint - seminar-11-Ch05-XML.ppt

Similar documents
+00DE _01EN.book

新・解きながら学ぶJava

MUGI Ver Copyright c 2001, 2002 Hitachi, Ltd. All rights reserved. 1

Microsoft Word - 01.DOC

untitled

Guava学习之Resources

Microsoft Word - 第3章.doc

FY.DOC

(\244j\257d\276\307\274\351_ C.indd_70%.pdf)

概述

Java

Microsoft PowerPoint - ch6 [相容模式]

untitled

目 錄 壹 青 輔 會 結 案 附 件 貳 活 動 計 劃 書 參 執 行 內 容 一 教 學 內 容 二 與 當 地 教 師 教 學 交 流 三 服 務 執 行 進 度 肆 執 行 成 效 一 教 學 課 程 二 與 當 地 教 師 教 學 交 流 三 服 務 滿 意 度 調 查 伍 服 務 檢

從 頭 到 尾 都 是 考 生 服 務 隊 在 為 我 們 服 務, 我 進 去 考 試 前 學 長 還 跟 我 說 加 油 呢 哈 哈! 他 們 的 服 務 真 的 相 當 的 好! 報 到 的 時 候 會 有 一 位 學 長 ( 也 或 許 是 學 姊 ) 向 該 組 說 明 考 試 方 式,

《大话设计模式》第一章

二O一四年大华府拖拉机游戏锦标赛规则

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

KillTest 质量更高 服务更好 学习资料 半年免费更新服务


中 国 中 西 医 结 合 杂 志 年 月 第 卷 第 期!" 通 透 性 增 加 产 生 蛋 白 水 解 酶 促 进 血 管 内 皮 细 胞 有 丝 分 裂 内 皮 细 胞 从 基 底 膜 上 迁 移 到 血 管 周 围 间 隙 粘 附 聚 集 重 构 为 三 维 管 腔 并 与 周 围 血 管

要 站 立 得 稳, 我 在 十 字 架 上 已 经 都 抢 夺 过 来 了, 将 魔 鬼 不 让 你 们 来 享 用 的 都 推 开 了, 这 是 让 我 们 来 得 到 的 话 语 我 们 再 也 不 被 奴 仆 的 轭 辖 制, 要 来 拥 有 才 可 以 明 知 道 却 不 去 抢 夺 过

Microsoft Word - 功医检测问&答

毛主席的猪

Microsoft Word - HERBRECIPES《中國藥膳》.doc

循经指压疗法

从 因 人 设 事 谈 起 一 部 文 学 作 品 ( 尤 其 是 长 篇 小 说 ) 的 结 构 至 关 重 要, 因 为 它 是 文 本 整 体 的 组 织 方 式 和 内 部 构 造, 既 是 形 式 又 是 内 容 ; 乃 是 表 达 主 题 最 有 效 的 艺 术 手 段 元 代 戏 曲

附件1.FIT)

北魏山东佛教文化个案研究




untitled

JavaIO.PDF

<4D F736F F D20AE67BD62B6A4C1FAB0EAB2BEA661B056BD6DAAF0B0EAB3F8A7695F30372E31302E31365F2E646F63>

幻灯片 1

新版 明解C++入門編

3.1 num = 3 ch = 'C' 2

Chapter 9: Objects and Classes

C/C++ - 字符输入输出和字符确认

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

MODBUS RTU MODE

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

untitled

untitled

chp6.ppt

区 结 果 和 试 验 细 节 应 放 在 正 文 中 描 述 表 中 最 左 侧 一 列 包 括 横 标 目 一 个 或 多 个 变 量 常 是 自 变 量 右 面 的 其 余 所 有 各 列 逐 项 行 对 齐 如 果 各 项 横 标 目 的 意 思 非 常 明 确 第 一 栏 可 以 不 写

座號

國家圖書館典藏電子全文

我 覺 得 流 病 的 各 單 元 之 間 常 常 都 有 相 連 的 觀 念, 中 間 要 是 有 觀 念 不 清 楚, 後 面 的 東 西 有 時 會 比 較 接 不 上 來 重 要 的 解 釋 名 詞 都 有 要 好 好 背, 容 易 考 的 申 論 題 要 整 理 成 筆 記 4. 衛 生

Learning Java

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

4 中 南 大 学 学 报 医 学 版 摘 要 目 的 探 讨 早 发 性 精 神 分 裂 症 患 者 在 静 息 状 态 下 是 否 存 在 脑 功 能 连 接 异 常 以 及 异 常 区 域 的 定 位 方 法 采 用 第 版 美 国 精 神 障 碍 诊 断 与 统 计 手 册 ( * ) (

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

<4D F736F F D20B2C4A4BBA9A1B8EAB054BAD8A46C2DB773BB44B443C5E9B27BAA70B56FAE69BB50A5BCA8D3B773C1CDB6D5BDD2ABE1A4DFB16F>

EJB-Programming-3.PDF

Chapter 9: Objects and Classes

93年度推薦甄選考古題

全国计算机技术与软件专业技术资格(水平)考试

Microsoft Word - 第四組心得.doc

出言成章中公教育专家历年研究发现

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

06 01 action JavaScript action jquery jquery AJAX CSS jquery CSS jquery HTML CSS jquery.css() getter setter.css('backgroundcolor') jquery CSS b

Microsoft Word - 國文.doc

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

CHAPTER 1

Microsoft Word - Book 8 將軍行.doc

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

2. 过程 这里主要使用 gdb 来拆炸弹 当然, 用其他工具来辅助, 应该可以更高效地完成 (gdb) echo ======================= Defuse Phase_1 ==============================\n\n ==================

EMC VNXe 系列故障排除任务清单

《计算机应用基础》学习材料(讲义)

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

2016年5月11日泉鲤政文【2016】46号(关于调整区政府行政权力和公共服务事项的通知).doc

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

Microsoft Word - 補陽食物.doc

文 每 由 充 羊 * 亚 就 N 有 达 品 周 成 虽 驰 水 拟 希 公 下 它 当 上 希 仿 上 潘 注 可 当 缪 歇 传 湖 也 也 对 多 生 古 反 或 只 牛 分 可 妙 西 4 期 杨 宏 芹 发 展 之 源 与 流 7 e < x ; > u 0 V 转 义 可 表 示 短

<4D F736F F D20A578AA46A46ABEC7A5AEB1D0A ADB5BCD6B1D0A8E32E646F63>

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF


e 2 3 2

期 李 环 等 邻 苯 二 甲 酸 二 丁 酯 暴 露 对 雄 性 大 鼠 生 精 细 胞 功 能 影 响 1 )!# $ + $#'!!) #!%,$' $ 6. $#! +!! '!!' # $! 引 言 - # # 近 年 来 生 殖 健 康 问 题 日 益 突 出 % 不 孕 不 育 等 各

Microsoft Word - 01封面

一只特立独行的猪.doc

<4D F736F F D20A6CBA55FA5ABBDC3A5CDA9D22DB3AFAB46A9FDA142AA4CAED1B7EC2E646F63>

<4D F736F F D20A641BFB3A4A4BEC75F28B3E6B6B529BDD2B57BB56FAE695FB971A46CC0C92E646F63>

Microsoft PowerPoint - ds-1.ppt [兼容模式]

基于ECO的UML模型驱动的数据库应用开发1.doc

一 总 体 要 求 一 ) 严 格 把 握 定 义 地 方 政 府 融 资 平 台 是 指 出 地 方 政 府 自 资 设 立 并 承 担 连 带 还 款 责 任 的 机 关 事 业 企.l 三 类 法 人 ( 二 ) 完 善 " 名 单 制 " 管 理 各 银 行 要 继 旗 完 善 融 资 平

6寸PDF生成工具

中 文 摘 要 智 慧 型 手 機 由 於 有 強 大 的 功 能, 以 及 優 渥 的 便 利 性, 還 能 與 網 路 保 持 隨 時 的 鏈 結 與 同 步 更 新, 因 此 深 受 廣 大 消 費 者 喜 愛, 當 然, 手 機 遊 戲 也 成 為 現 代 人 不 可 或 缺 的 娛 樂 之


出 青 岛 优 势 创 新 跨 境 电 子 商 务 发 展 机 制 坚 持 协 调 发 展 在 发 展 中 规 范 在 规 范 中 发 展 正 确 处 理 好 政 府 与 市 场 规 范 与 发 展 当 前 与 长 远 进 口 与 出 口 监 管 与 便 利 化 等 关 系 坚 持 绿 色 发 展

2


制 普 通 高 中 学 生 职 业 高 中 学 生 中 等 专 业 学 校 学 生 均 可 参 加 1 2, 大 赛 命 題 : 本 届 大 赛 由 中 国 中 学 生 作 文 大 赛 命 题 委 员 会 命 题 初 中 组 高 中 组 各 1 6 道 题 目 供 参 赛 者 选 用 见 附 件 全

!$ 能 利 用 床 旁 影 像 学 检 查 手 段 迅 速 作 出 主 动 脉 夹 层 的 定 性 诊 断 和 定 位 诊 断 一 旦 明 确 诊 断 迅 速 联 系 胸 外 科 做 好 手 术 准 备 以 分 秒 必 争 挽 救 患 者 的 生 命 作 为 第 一 要 务 杨 鹏 曲 阜 市 中

目 录 一 参 保 范 围 对 象 和 费 用 缴 纳 二 个 人 账 户 资 金 的 管 理 和 使 用 一 构 成 二 的 使 用 范 围 三 个 人 账 户 资 金 用 于 门 诊 就 医 和 药 店 购 药 费 用 报 销 的 办 法 四 医 疗 保 险 卡 的 作 用 五 使 用 医 疗

* +, -.%, * %(/, & 0!

Transcription:

00801075 李宣成

新奥尔良人, 纽约科技大学副教授, 主要讲授 Java XML 以及面向对象编程,Internet 方面国际知名的作家 程序员和教育家,Java 创始人之一 http://www.elharo.com/ 他的网站 Café au Lait :(http://www.cafeaulait.org) 是互联网上最流行的独立 Java 网站之一 ; 他的另一个网站 Café con Leche :(http://www.cafeconleche.org) 则是最流行的 XML 站点之一 他编写了二十余本书籍, 包括 Java I/O, Java Network Programming 和 XML in a Nutshell 等等

铺垫 XML: 可扩展标记语言, 为通用标记语言的一种, 是一种简单易用的数据存储语言 与 HTML 相比, 更为严谨简洁, 且效能更佳 例 : <?xml version="1.0" encoding="iso-8859-1"?> <book catalog="programming"> <title>beautiful Code</title> <author>leading Programmers</author> <year>2010</year> <price>99.0</price> </book>

铺垫 JDOM XOM: 两者都是 XML 的 API, 使得程序员可以通过 Java 来访问 操作和输出 XML 数据 DTD: 文档类型定义, 一个 XML 文档可以引用外部的 DTD, 也可以自身在开头使用!DOCTYPE!ELEMENT!ATTLIST 等操作来定义 DTD, 它声明了 XML 文档的元素, 并描述了文档的格式 一个 XML 文档可以携带一个 DTD 来测试它是否为有效的 XML 文档 例 : <?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> 对应于这个 DTD 的定义, 合法的 XML 文档有如下的格式 : <note> <to>tove</to> <from>jani</from> <heading>reminder</heading> <body>don't forget me this weekend</body> </note>

铺垫 Namespace: 即文中所说的命名空间, 它的使用是为了区分不同 XML 应用中同名的元素和属性或者在应用中归类相关的元素和属性, 让程序能容易地识别它们 命名空间在操作上是将每个元素和属性加上一个前置字, 每个前置字都对应到一个 URI 附属于同一个 URI 的元素和属性, 会属于同一个命名空间, 标准 URI 可用来识别不同 XML 应用的元素 命名空间中的元素和属性之名称会包含一个冒号, 在它之前的所有东西, 称作前置字 而之后的所有东西, 称作局部名字 <?xml version= 1.0 encoding= ISO-8859-1 standalone= yes?> <catalog> <book> <title> Beautiful Code </title> </book> <paint> <pt:title> 111</pt:title> </paint> </catalog>

确保 XML 文档正确性所需要的两个冗余的数据检查 : 1 输入验证, 验证 XML 文档的结构是否符合规范以及与其所携带的 DTD 所匹配 2 输出验证, 使用 DOM JDOM 等工具构造 XML 文档时检查传递给 API 的字符串在 XML 中的合法性 XML 名字的合法性约束 : 文档中不允许出现交迭的元素 ( 由于 JDOM 的机制不需考虑 ) 元素名 属性名或者处理指令的名字必须是合法的 XML 名字 局部名字不能包含冒号 属性的命名空间不能与其父元素或者兄弟属性的明明空间冲突 每一个 Unicode 的代理字符出现在一个代理对中 处理指令数据不包含双字节字符串?>

例 5-1. 分析 XML 名字的 BNF 语法 BaseChar ::= [#x0041-#x005a] [#x0061-#x007a] [#x00c0- BNF 语法 : #x00d6] NameChar ::= Letter Digit '.' '-' '_' ':' CombiningChar 中的字代表字符 Extender 本身 Name ::= (Letter '_' ':') (NameChar)* < > 中的为必选项 Letter ::= BaseChar Ideographic [ ] 中的为可选项 Ideographic ::= [#x4e00-#x9fa5] #x3007 [#x3021-#x3029] { 中的为可重复 0 Digit ::= [#x0030-#x0039] [#x0660-#x0669] [#x06f0-#x06f9] 至无数次的项 [#x0966-#x096f] [#x09e6-#x09ef] [#x0a66-#x0a6f] 表示左右两边任 [#x0ae6-#x0aef] [#x0b66-#x0b6f] [#x0be7-#x0bef] 选一项 [#x0c66-#x0c6f] [#x0ce6-#x0cef] [#x0d66-#x0d6f] ::= 是 被定义为 的 [#x0e50-#x0e59] [#x0ed0-#x0ed9] [#x0f20-#x0f29] 意思 Extender ::= #x00b7 #x02d0 #x02d1 #x0387 #x0640 #x0e46 #x0ec6 #x3005 [#x3031-#x3035] [#x309d-#x309e] [#x30fc-#x30fe] [#x00d8-#x00f6] [#x00f8-#x00ff] [#x0100-#x0131] [#x0134-#x013e]... CombiningChar ::= [#x0300-#x0345] [#x0360-#x0361] [#x0483- #x0486] [#x0591-#x05a1] [#x05a3-#x05b9] [#x05bb-#x05bd] #x05bf [#x05c1-#x05c2] #x05c4 [#x064b-#x0652] #x0670 [#x06d6-#x06dc]...

private static String checkxmlname(string name) { // Cannot be empty or null if ((name == null) (name.length() == 0) (name.trim( ).equals(""))) { return "XML names cannot be null or empty"; 第// Cannot start with a number 一char first = name.charat(0); if (Character.isDigit(first)) { 个return "XML names cannot begin with a number."; 版 // Cannot start with a $ 本if (first == '$') { 的return "XML names cannot begin with a dollar sign ($)."; 名// Cannot start with a _ 字if (first == '-') { return "XML names cannot begin with a hyphen (-)."; 字 符// Ensure valid content for (int i=0, len = name.length( ); i<len; i++) { 验char c = name.charat(i); 证if ((!Character.isLetterOrDigit(c)) && (c!= '-') && (c!= '$') && (c!= '_')) { return c + " is not allowed in XML names."; // We got here, so everything is OK return null;

版本一的缺陷 : 它使用 Java 自带的判定函数来判断字符是否合法 由此导致两个问题 : Java 中这些函数的定义并没有完全遵照 XML 中关于字母和数字的定义 即 Java 把一些 XML 中非法的字母视为合法, 或者正好相反 Java 中的验证规则在版本更新时会有所变化, 而 XML 的验证规则没有变化另外, 这个版本允许在名字中包含冒号, 这不利于维持命名空间的良好形式 P.S. XML 中不合法的字 符可以将其转化为实体使 用, 如 : &lt < &gt > &amp & &pos &quot * XML 标准 1.1 中建议文档作者使用在自然语言中有意义的字词作为 XML 名称, 并避免在名称中使用符号字符或空白字符 注意 : 冒号 (:) 连字符 (-) 句号 (.) 下划线 (_) 和圆点 ( ) 是明确允许的 详请参见 : http://www.w3china.org/translation/xml1p1cr20021015_cn. htm

private static String checkxmlname(string name) { // Cannot be empty or null if ((name == null) (name.length( ) == 0) (name.trim( ).equals(""))) { return "XML names cannot be null or empty"; // Cannot start with a number char first = name.charat(0); if (!isxmlnamestartcharacter(first)) { return "XML names cannot begin with the character \"" + first + "\""; // Ensure valid content for (int i=0, len = name.length( ); i<len; i++) { char c = name.charat(i); if (!isxmlnamecharacter(c)) { return "XML names cannot contain the character \"" + c + "\""; // We got here, so everything is OK return null;

以上程序中调用的几个函数 : public static boolean isxmlnamecharacter(char c) { return (isxmlletter(c) isxmldigit(c) c == '.' c == '-' c == '_' c == ':' isxmlcombiningchar(c) isxmlextender(c)); public static boolean isxmlnamestartcharacter(char c) { return (isxmlletter(c) c == '_' c ==':'); public static boolean isxmldigit(char c) { if (c >= 0x0030 && c <= 0x0039) return true; if (c >= 0x0660 && c <= 0x0669) return true; if (c >= 0x06F0 && c <= 0x06F9) return true; if (c >= 0x0966 && c <= 0x096F) return true; if (c >= 0x09E6 && c <= 0x09EF) return true; if (c >= 0x0A66 && c <= 0x0A6F) return true; if (c >= 0x0AE6 && c <= 0x0AEF) return true; if (c >= 0x0B66 && c <= 0x0B6F) return true; if (c >= 0x0BE7 && c <= 0x0BEF) return true; if (c >= 0x0C66 && c <= 0x0C6F) return true; if (c >= 0x0CE6 && c <= 0x0CEF) return true; if (c >= 0x0D66 && c <= 0x0D6F) return true; if (c >= 0x0E50 && c <= 0x0E59) return true; if (c >= 0x0ED0 && c <= 0x0ED9) return true; if (c >= 0x0F20 && c <= 0x0F29) return true; return false;

public static boolean isxmldigit(char c) { if (c < 0x0030) return false; if (c <= 0x0039) return true; if (c < 0x0660) return false; if (c <= 0x0669) return true; if (c < 0x06F0) return false; if (c <= 0x06F9) return true; if (c < 0x0966) return false; if (c <= 0x096F) return true; if (c < 0x09E6) return false; if (c <= 0x09EF) return true; if (c < 0x0A66) return false; if (c <= 0x0A6F) return true; if (c < 0x0AE6) return false; if (c <= 0x0AEF) return true; if (c < 0x0B66) return false; if (c <= 0x0B6F) return true; if (c < 0x0BE7) return false; if (c <= 0x0BEF) return true; if (c < 0x0C66) return false; if (c <= 0x0C6F) return true; if (c < 0x0CE6) return false; if (c <= 0x0CEF) return true; if (c < 0x0D66) return false; if (c <= 0x0D6F) return true; if (c < 0x0E50) return false; if (c <= 0x0E59) return true; if (c < 0x0ED0) return false; if (c <= 0x0ED9) return true; if (c < 0x0F20) return false; if (c <= 0x0F29) return true; 同时识别合法和非法字符 return false;

private Element( ) { static Element build(string name, String uri, String localname) { Element result = new Element( ); String prefix = ""; int colon = name.indexof(':'); if (colon >= 0) { prefix = name.substring(0, colon); result.prefix = prefix; result.localname = localname; // We do need to verify the URI here because parsers are // allowing relative URIs which XOM forbids, for reasons // of canonical XML if nothing else. But we only have to verify // that it's an absolute base URI. I don't have to verify // no conflicts. if (! "".equals(uri)) Verifier.checkAbsoluteURIReference(uri); result.uri = uri; return result;

验证 16 进制字符的 switch 语句 : switch(c) { case '0': return true; case '1': return true; case '2': return true; case 'd': return true; case 'e': return true; case 'f': return true; return false; >64K 大型 switch 语句 直接查表, 按位储存信息

保存并复制二进制查找表 : <target name="compile-core" depends="prepare, compile-jaxen" description="compile the source code"> <javac srcdir="${build.src" destdir="${build.dest"> <classpath refid="compile.class.path"/> </javac> <copy file="${build.src/nu/xom/character s.dat" tofile="${build.dest/nu/xom/charac ters.dat"/> </target> 装载二进制查找表 : private static byte[] flags = null; static { ClassLoader loader = Verifier.class.getClassLoader( ); if (loader!= null) loadflags(loader); // If that didn't work, try a different ClassLoader if (flags == null) { loader = Thread.currentThread().getContextClassLoader( ); loadflags(loader); private static void loadflags(classloader loader) { DataInputStream in = null; try { InputStream raw = loader.getresourceasstream("nu/xom/characters.d if (raw == null) { throw new RuntimeException("Broken XOM installation: " + "could not load nu/xom/characters.dat"); in = new DataInputStream(raw); flags = new byte[65536]; in.readfully(flags); catch (IOException ex) { throw new RuntimeException("Broken XOM installation: " + "could not load nu/xom/characters.dat"); finally { try { if (in!= null) in.close( ); catch (IOException ex) { // no big deal

使用查表法验证名字 : private static void loadflags(classloader loader) { DataInputStream in = null; try { InputStream raw = loader.getresourceasstream("nu/xom/characters.dat"); if (raw == null) { throw new RuntimeException("Broken XOM installation: " + "could not load nu/xom/characters.dat"); in = new DataInputStream(raw); flags = new byte[65536]; in.readfully(flags); catch (IOException ex) { throw new RuntimeException("Broken XOM installation: " + "could not load nu/xom/characters.dat"); finally { try { if (in!= null) in.close( ); catch (IOException ex) { // no big deal

在缓存中记录命名空间的 URI private final static class URICache { private final static int LOAD = 6; private String[] cache = new String[LOAD]; private int position = 0; synchronized boolean contains(string s) { for (int i = 0; i < LOAD; i++) { // Here I'm assuming the namespace URIs are interned. // This is commonly but not always true. This won't // break if they haven't been. Using equals( ) instead // of == is faster when the namespace URIs haven't been // interned but slower if they have. if (s == cache[i]) { return true; return false; synchronized void put(string s) { cache[position] = s; position++; if (position == LOAD) position = 0;