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.

数据一般分为三类:

结构化数据

这种类别的数据最好处理,只要简单的建立一个对应的表就可以了。
 

非结构化数据

像图片、声音、视频等等。这类信息我们通常无法直接知道他的内容,数据库也只能将它保存在一个BLOB字段中,对以后检索非常麻烦。
一般的做法是,建立一个包含三个字段的表(编号 number、内容描述 varchar(1024)、内容 blob)。引用通过编号,检索通过内容描述。
 

半结构化数据

这样的数据和上面两种类别都不一样,它是结构化的数据,但是结构变化很大。因为我们要了解数据的细节所以不能将数据简单的组织成一个文件按照非结构化数据处理,由于结构变化很大也不能够简单的建立一个表和他对应。
先举一个半结构化的数据的例子,比如存储员工的简历。不像员工基本信息那样一致每个员工的简历大不相同。有的员工的简历很简单,比如只包括教育情况;有的员工的简历却很复杂,比如包括工作情况、婚姻情况、出入境情况、户口迁移情况、党籍情况、技术技能等等。
还有可能有一些我们没有预料的信息。通常我们要完整的保存这些信息并不是很容易的,因为我们不会希望系统中的表的结构在系统的运行期间进行变更。

半结构化数据如何存储?

化解为结构化数据

这种方法通常是对现有的简历中的信息进行粗略的统计整理,总结出简历中信息所有的类别同时考虑系统真正关心的信息。对每一类别建立一个子表,比如上例中我们可以建立教育情况子表、工作情况子表、党籍情况子表等等,并在主表中加入一个备注字段,将其它系统不关心的信息和一开始没有考虑到的信息保存在备注中。
  • 优点:查询统计比较方便。
  • 缺点:不能适应数据的扩展,不能对扩展的信息进行检索,对项目设计阶段没有考虑到的同时又是系统关心的信息的存储不能很好的处理。
 

用XML格式来组织并保存到CLOB字段中   <-- 本章的重点

XML可能是最适合存储半结构化的数据了。将不同类别的信息保存在XML的不同的节点中就可以了。
  • 优点:能够灵活的进行扩展,信息进行扩展式只要更改对应的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 &lt; 1000 then</message>

在 XML 中有 5 个预定义的实体引用:

&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ' 省略号
&quot; " 引号

注释:严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

ProcessingInstruction

表示处理指令:必须以“<?”作为开头,以“?>”作为结尾,XML文档声明语句就是最常见的一种处理指令,如下:

<?xml version="1.0" encoding="utf-8"?>
  文档声明必须写在第一行第一列
  属性:
    version:xml的版本 1.0(使用) 1.1
    encoding:xml的编码 utf-8 gbk iso-8859-1(不包含中文)
    standalone:是否需要依赖其他的文件 yes/no
 
 
Comments
<!-- 注释的内容 -->
  注释不能放在第一行第一列。

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的分类

  1. Validating versus non-validating parsers
  2. Parsers that support the Document Object Model (DOM)
  3. Parsers that support the Simple API for XML (SAX)
  4. 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的更多相关文章

  1. Odoo ir actions 分析

    源代码位置:openerp/addons/base/ir/ir_actions.py 根类型:ir.actions.actions class actions(osv.osv): _name = 'i ...

  2. 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 ...

  3. odoo模块

    odoo模块包括 业务对象,web控制器,数据文件,前面2个是Python模块,而数据文件则是odoo特有的文件,例如,odoo数据文件,web数据.这些数据文件在 __odoo__.py 进行定义, ...

  4. (30)odoo中的快捷标签

    * 快捷标签   提供快捷标签是为了简化代码的编码,把复杂的工作封装化   * 找到封装化的源码:  openerp/tools/convert.py   xml_import      self._ ...

  5. (24)odoo中模型标识汇总

    * 设置->技术->数据结构->模型                模型    模型描述    类型    瞬态模型account.account    科目    基础对象    ...

  6. (20)odoo中的action

    ---------更新时间18:06 2016-09-18 星期日15:05 2016-03-14 星期一18:07 2016-02-19 星期五---------* 窗口动作   <?xml ...

  7. (13)odoo翻译

    -------------------更新时间:15:52 2016-09-28 星期三 增加模型名翻译17:26 2016-05-20 星期五17:58 2016-05-17 星期二12:14 20 ...

  8. (06)odoo报表

    ----------更新时间:18:06 2016-09-18 星期日18:13 2016-04-05 星期二10:31 2016-03-01 星期二----------* odoo8 采用是Qweb ...

  9. 本人AI知识体系导航 - AI menu

    Relevant Readable Links Name Interesting topic Comment Edwin Chen 非参贝叶斯   徐亦达老板 Dirichlet Process 学习 ...

随机推荐

  1. java.net.SocketException四大异常解决方案

    java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketExceptio ...

  2. Dll注入经典方法完整版

    总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...

  3. springboot2.X 集成redis+消息发布订阅

    需求场景:分布式项目中,每个子项目有各自的 user 数据库, 在综合管理系统中存放这所有用户信息, 为了保持综合管理系统用户的完整性, 子系统添加用户后将用户信息以json格式保存至redis,然后 ...

  4. JavaScript比较两个对象的值是否相等

    JavaScript比较两个对象的值是否相等 function isObjectValueEqual(a, b) { var aProps = Object.getOwnPropertyNames(a ...

  5. windows多线程同步--事件

    推荐参考博客:秒杀多线程第六篇 经典线程同步 事件Event   事件是内核对象,多用于线程间通信,可以跨进程同步 事件主要用到三个函数:CreateEvent,OpenEvent,SetEvent, ...

  6. Spring4学习笔记一:环境搭建与插件安装、基本概念理解

    一:环境搭建 1:开发环境:JDK安装.Eclipse安装 2:数据库:Mysql.Sequel Pro(数据库可视化操作工具) 3:web服务器:Tomcat下载,并且把tomcat配置到Eclip ...

  7. Redis系列--内存淘汰机制(含单机版内存优化建议)

    https://blog.csdn.net/Jack__Frost/article/details/72478400?locationNum=13&fps=1 每台redis的服务器的内存都是 ...

  8. 创建一个可拖动的DIV

    var drag = function(){ var obj = document.getElementById("id"); var s = obj.style; var b = ...

  9. SNF开发平台WinForm-审核流使用方法样例

    一.效果如下: 二.如何实现 1.程序的数据表设计规范,参考<09.SNF-C#编程规范V1.5.docx>文件. 2.程序操作程序 2.1.在程序页面拖拽控件 2.2.程序的Load事件 ...

  10. FFMPEG中关于ts流的时长估计的实现(转)

    最近在做H.265 编码,原本只是做编码器的实现,但客户项目涉及到ts的封装,搞得我不得不配合了解点ts方面的东西.下面技术文档不错,转一下. ts流中的时间估计 我们知道ts流中是没有时间信息的,我 ...