[IR] What is XML
Concept: http://www.w3school.com.cn/xml/xml_cdata.asp
Semistructured:
和普通纯文本相比,半结构化数据具有一定的结构性。OEM(Object exchange Model)是一种典型的半结构化数据模型。
An OEM object contains:
- an object identifier,
- a descriptive textual label,
- a type,
- a value.
数据一般分为三类:
结构化数据
非结构化数据
半结构化数据
半结构化数据如何存储?
化解为结构化数据
- 优点:查询统计比较方便。
- 缺点:不能适应数据的扩展,不能对扩展的信息进行检索,对项目设计阶段没有考虑到的同时又是系统关心的信息的存储不能很好的处理。
用XML格式来组织并保存到CLOB字段中 <-- 本章的重点
- 优点:能够灵活的进行扩展,信息进行扩展式只要更改对应的DTD或者XSD就可以了。
- 缺点:查询效率比较低,要借助XPATH来完成查询统计,随着数据库对XML的支持的提升性能问题有望能够很好的解决。
XML基本结构
Elem与Attr的基本区别:作用域不同
CDATA Section
术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
在 XML 元素中,"<" 和 "&" 是非法的。
- "<" 会产生错误,因为解析器会把该字符解释为新元素的开始。
- "&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。
某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>
可见,XML不须解析的部分变为灰色。
转义字符 - 实体引用(entity reference)
假如您在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。因此你不能这样写:
<message>if salary < 1000 then</message>
为了避免此类错误,需要把字符 "<" 替换为实体引用,就像这样:
<message>if salary < 1000 then</message>
在 XML 中有 5 个预定义的实体引用:
< | < | 小于 |
> | > | 大于 |
& | & | 和号 |
' | ' | 省略号 |
" | " | 引号 |
注释:严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。
ProcessingInstruction
表示处理指令:必须以“<?”作为开头,以“?>”作为结尾,XML文档声明语句就是最常见的一种处理指令,如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- 注释的内容 -->
Namespaces
表示:isbn:number的defination 在 xmlns中链接位置所示。
<number>15</number> 是local defination。
在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。
这个 XML 文档携带着某个表格中的信息:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
这个 XML 文档携带有关桌子的信息(一件家具):
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
假如这两个 XML 文档被一起使用,由于两个文档 都包含带有不同内容和定义的 <table> 元素,就会发生命名冲突。
XML 解析器无法确定如何处理这类冲突。
Solution:
这个 XML 文档携带着某个表格中的信息:
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
此 XML 文档携带着有关一件家具的信息:
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
在使用前缀基础上,我们为 <table> 标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。
xpath vs sql
SQL在这里操作明显复杂!
根本原因在于:查询语句应该利用trie的结构特性。
XML Parsers的分类
- Validating versus non-validating parsers
- Parsers that support the Document Object Model (DOM)
- Parsers that support the Simple API for XML (SAX)
- Parsers written in a particular language (Java, C, C++, Perl, etc.)
SAX Parser的优势
-- 重难点
不同于DOM技术,SAX是事件驱动型的XML解析方式。
它顺序读取XML文件,不需要一次全部装载整个文件。
当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,
适合对XML的顺序访问。
DOM Parser的优势
DOM Parser produces a memory tree (DOM Tree) after parsing
Task of writing parsers is reduced to coding against the DOM Tree API.
Domain-specific frameworks will be written on top of DOM.
You can build a DOM parser using a SAX parser:
Normalizing a Tree
XML DOM normalize() 方法
这个方法将遍历当前节点的所有子孙节点,通过删除空的 Text 节点,以及合并所有相邻的 Text 节点来规范化文档。
该方法在进行节点的插入或删除操作后,对于简化文档树的结构很有用。也算是压缩哇,毕竟节省了空间。
DOM vs. SAX
If your document is very large and you only need a few elements - use SAX
If you need to process many elements and perform manipulations on XML - use DOM
If you need to access the XML many times - use DOM
C Parser Library
Link: https://libexpat.github.io/
Key functions in Expat:
XML_ParserCreate
// Create a new parser object.
XML_SetElementHandler
// Set handlers for start and end tags.
XML_SetCharacterDataHandler
// Set handler for text.
XML_Parse
// Pass a buffer full of document to the parser
Outline.c
void main (int argc, char **argv) {
XML_Parser p = XML_ParserCreate(NULL);
if (! p) {
fprintf(stderr, "Couldn't allocate memory for parser\n");
exit(-);
} XML_SetElementHandler(p, start, end);
for (;;) {
int done; int len;
len = fread(Buff, , BUFFSIZE, stdin);
if (ferror(stdin)) {
fprintf(stderr, "Read error\n"); exit(-);
}
done = feof(stdin);
if (! XML_Parse(p, Buff, len, done)) {
fprintf(stderr, "Parse error at line %d:\n%s\n",
XML_GetCurrentLineNumber(p), XML_ErrorString(XML_GetErrorCode(p)));
exit(-);
}
if (done) break;
}
} /* End of main */ char Buff[BUFFSIZE];
int Depth;
void start(void *data, const char *el, const char **attr) {
int i;
for (i = ; i < Depth; i++) printf(" ");
printf("%s", el);
for (i = ; attr[i]; i += ) {
printf(" %s='%s'", attr[i], attr[i + ]);
}
printf("\n");
Depth++;
} /* End of start handler */ void end(void *data, const char *el) {
Depth--;
} /* End of end handler */
XPath for XML 跳转到 [IR] XPath for Search Query
[IR] What is XML的更多相关文章
- Odoo ir actions 分析
源代码位置:openerp/addons/base/ir/ir_actions.py 根类型:ir.actions.actions class actions(osv.osv): _name = 'i ...
- ODOO-10.0 错误 Could not execute command 'lessc'
2017-01-05 20:24:12,473 4652 INFO None odoo.service.db: Create database `hello`. 2017-01-05 20:24:16 ...
- odoo模块
odoo模块包括 业务对象,web控制器,数据文件,前面2个是Python模块,而数据文件则是odoo特有的文件,例如,odoo数据文件,web数据.这些数据文件在 __odoo__.py 进行定义, ...
- (30)odoo中的快捷标签
* 快捷标签 提供快捷标签是为了简化代码的编码,把复杂的工作封装化 * 找到封装化的源码: openerp/tools/convert.py xml_import self._ ...
- (24)odoo中模型标识汇总
* 设置->技术->数据结构->模型 模型 模型描述 类型 瞬态模型account.account 科目 基础对象 ...
- (20)odoo中的action
---------更新时间18:06 2016-09-18 星期日15:05 2016-03-14 星期一18:07 2016-02-19 星期五---------* 窗口动作 <?xml ...
- (13)odoo翻译
-------------------更新时间:15:52 2016-09-28 星期三 增加模型名翻译17:26 2016-05-20 星期五17:58 2016-05-17 星期二12:14 20 ...
- (06)odoo报表
----------更新时间:18:06 2016-09-18 星期日18:13 2016-04-05 星期二10:31 2016-03-01 星期二----------* odoo8 采用是Qweb ...
- 本人AI知识体系导航 - AI menu
Relevant Readable Links Name Interesting topic Comment Edwin Chen 非参贝叶斯 徐亦达老板 Dirichlet Process 学习 ...
随机推荐
- python 元组和字典中元素作为函数调用参数传递
模式1. def test1(*args): test3(*args) def test2(**kargs): test3(**kargs) def test3(a, b): print(a,b) ...
- unity3d 脚本周期函数
1,编辑器阶段 Reset方法:当脚本第一次添加到游戏对象或执行Reset命令时会调用Reset方法,常用来初始化脚本的各个属性: 2,场景第一次加载阶段 Awake方法:在Start方法之前调用: ...
- 中国非正常死亡最高的行业 TOP 10
1月2日晚,佟大为等艺人.业内人士及小马奔腾集团员工纷纷在朋友圈或微博上发布消息,小马奔腾集团董事长李明因心肌梗塞于当晚去世,年仅47岁. 这再次将创业者和职场人士健康问题推到了公众面前,而就在去年中 ...
- fatal error C1859 意外的预编译头错误,只需重新运行编译器(转)
微软的建议 要解决此问题,请使用下列方法之一. http://support.microsoft.com/kb/976656/zh-cn 方法 1 禁用/analyze编译器选项,则它会被启用. 方法 ...
- 使用Doxygen + graphviz生成Unity 3d的UGUI类图
下载软件 1) Graphviz,下载地址:http://download.csdn.net/detail/u010953266/8591169 为什么不用官网?一是下载速度慢,二是下载到本地的文件貌 ...
- windows server 2008 R2安装图片浏览器/照片查看器方法
有用户的电脑安装了windows server 2008 R2,浏览大量图片时很不方便,因为系统中没有照片查看器或图片浏览器.其实,win2008 R2是有照片查看器的,只是默认情况下没有开启.参考以 ...
- chapter15中使用generator来实现异步化操作的同步化表达的例子
在p203中作者给了一个例子,我感觉这个例子写的不好,一开始我没有看懂,因为中间有很多细节没有交代,直到看了第二个用generator来实现ajax的例子之后才有所领悟. 所以我把作者给的这个用g ...
- 如何去掉Autodesk教育版印戳
在打开一些CAD图形文件的时候,有时会遇到这样的提示: 当我们打印图形的时候,就会在标题栏显示"由Autodesk教育版产品生成",这个标题据说是用盗版CAD文件造成的,虽然我们用 ...
- docker部署maven私有仓库 nexus3
docker pull sonatype/nexus3: docker run -d --name nexus3.x --network host -v /volume-data/nexus3/nex ...
- wine qq 2013 for linux deb包 Ubuntu 64位兼容
2013-08-08 Wine 1.6,如果您想体验下该版本的wine,目前可以通过ppa进行安装: sudo add-apt-repository ppa:ubuntu-wine/ppa ...