用于解析ebml(可扩展二进制标记语言)数据的轻量级“纯python”库。

ebmlite的Python项目详细描述


_ ebmlite自述
================ < BR>
u ebmlite是一个轻量级的"纯python"库,用于解析ebml(可扩展二进制标记语言)数据。它被设计成快速高效地浏览ebml文件,就这样。_ ebmlite也可以进行基本的ebml编码,但更高级的ebml操作(例如使用适当的[dom](https://en.wikipedia.org/wiki/document_object_model))超出了它的范围,最好留给其他库。 < BR>
u ebmlite目前正在进行中。它是可用的(我们广泛使用它),但还没有实现完整的ebml规范。 < BR>
ebmlite的一部分是根据[python ebml]建模的(https://github.com/jspiros/python ebml),我们以前一直在使用它,但它不是一个直接的派生作品。_ ebmlite可以导入python-ebml模式xml(在一定程度上),但这是其交叉兼容性的程度。 < BR>
ebml概述(简称)
--- < BR>
[ebml](http://matroska-org.github.io/libebml/)(可扩展二进制标记语言)是一种分层标记二进制格式,最初是为[matroska]项目(https://www.matroska.org/)创建的。ebml的层次结构与xml有一些概念/功能上的相似性,尽管实际的结构有很大的不同。 < BR>
在raw中,ebml元素由数字id、元素大小和有效负载组成。它节省空间;id和大小描述符的长度是可变的,使用前缀位来表示它们的长度,这是一个类似utf-8的系统。id到名称和有效负载数据类型的映射是通过外部模式完成的。 < BR>
有关详细信息,请参阅[官方规范](http://matroska-org.github.io/libebml/specs.html)。 < BR>
ebml模式
---- < BR>
如果没有定义其元素的模式,ebml文件在很大程度上是没有意义的。模式将元素id映射到名称和数据类型;它还描述了结构(例如,哪些元素可以是其他元素的子元素),并提供了额外的元数据。*注意:ebmlite当前仅使用该结构进行解码,不严格执行它。* < BR>
ebmlite模式是用xml定义的。从这些xml文件中创建一个schema实例;schema中是xml中定义的每个元素的element子类。由于ebml文件的解释几乎完全依赖于模式,因此ebml文件的导入是通过一个"schema"实例完成的。 < BR>
``巨蟒
来自ebmlite导入加载架构
schema=loadschema('mide_ide.xml')
doc=schema.load('test_file.ebml')
< BR>
u ebmlite使用自己的模式定义语法;它还可以导入python ebml模式。它(当前)不使用[官方模式格式](https://github.com/matroska org/ebml specification/blob/master/specification.markdown ebml schema)。 < BR>
下面是一个ebmlite模式的示例,显示了标准ebml头元素定义的简化版本: 'BR/'` XML BR/>?xml version="1.0"encoding="utf-8"?gt;
<;架构>;
<;masterelement name="ebml"id="0x1a45dfa3"mandatory="1"multiple="0">;
<;uintegreement name="ebmlversion"id="0x4286"multiple="0"mandatory="1"/>;
<;uintegreement name="ebmlreadversion"id="0x42f7"multiple="0"mandatory="1"/>;
<;uintegreement name="ebmlmaxidlength"id="0x42f2"multiple="0"mandatory="1"/>;
<;uintegreement name="ebmlmaxsizeleng"id="0x42f3"multiple="0"mandatory="1"/>;
<;stringelement name="doctype"id="0x4282"multiple="0"mandatory="1"/>;
<;uintegreement name="doctypeversion"id="0x4287"multiple="0"mandatory="1"/>;
<;binaryement name="void"global="1"id="0xec"multiple="1"/>;
<;binaryement name="crc-32"global="1"id="0xbf"multiple="0"/>;
<;masterelement name="signatureslot"global="1"id="0x1b538667"multiple="1">;
<;uintegreement name="signaturealgo"id="0x7e8a"multiple="0"/>;
<;uintegreement name="signaturehash"id="0x7e9a"multiple="0"/>;
<;binaryement name="signaturepublickey"id="0x7ea5"multiple="0"/>;
<;binaryement name="signature"id="0x7eb5"multiple="0"/>;
<;masterelement name="signatureelements"id="0x7e5b"multiple="0">;
<;masterelement name="signatureelementlist"id="0x7e7b"multiple="1">;
<;binaryement name="signedelement"id="0x6532"multiple="1"/>;
<;主元素>;
<;主元素>;
<;主元素>;
<;主元素>;
<;!--接下来会有更多的定义…---GT;
<;架构>;
< BR>
模式中定义的每个元素都是8个元素基类之一的子类:
**masterelement:**包含其他元素的元素。
**integerElement:**包含可变长度的有符号整数值。
**uintegreement:**包含可变长度的无符号整数值。
**floatilement:**包含32位或64位浮点值。
**stringelement:**包含可打印的US-ASCII字符(0x20到0x7E)。
**unicodelement:**包含UTF-8字符串数据。
**dateelement:**包含时间戳,自2001-01-01t00:00:00 UTC起存储为纳秒,作为64位整数。_ ebmlite会自动将其转换为python"datetime.datetime"对象。
**binaryement:**包含二进制数据。 < BR>
元素定义有几个属性:
*`name`(string):元素子类的名称。
*`id`(整数):元素子类'ebml id。
*`global`(bool,可选):如果"true"(例如"1"或"true"),则元素可以
出现在ebml文件的任何位置,而不仅仅是出现在
模式。这相当于python-ebml架构中的"深度"为"-1"
*`length`(整数,可选):对元素进行编码时使用的固定大小,覆盖ebml可变长度编码。用于创建与字节对齐的结构。
*`multiple`(bool,可选,默认值=1):表示元素可以在同一父元素中出现多次。*当前部分强制用于编码。*
*`mandatory`(bool,可选,默认值=0):表示元素*必须*存在。*当前未强制执行。*
*`precache`(bool,可选,默认值因类型而异):指示在解析元素时应读取和缓存元素的值,而不是在显式访问时"延迟加载"。可用于在导入ebml文件后处理该文件时减少查找次数。简单的数值元素类型在默认情况下启用了此功能;master、binary和string/unicode元素不启用此功能。 < BR>
有两个附加的特殊情况元素子类,它们不是子类:
**unknownelement:**为具有架构中未显示的ID的元素实例化。其有效载荷被视为二进制数据。未知元素本身不会出现在架构中。与其他元素子类不同,它的id可以随实例而变化。
**voidElement:**"void"(id`0xec`)是标准的ebml元素,通常用于填充。如果模式定义了void元素,它将被这个特殊的case元素替换。其有效负载的内容将被忽略。 < BR>
模式的xml结构定义了ebml文档的结构;模式中masterelement的子元素是ebml中有效的子元素类型。元素类型可以在架构中多次出现;即,如果其类型可以作为不同父类型的子类型出现。只有第一个定义同时需要"name"和"id"属性。连续D定义可以缩写为"name"和/或"id";它们将继承第一个定义的所有其他属性。然而,连续的定义必须不具有相互矛盾的属性。 'BR/'` XML
<;架构>;
<;主元素名称="parent1"id="0x5210">;
<;!--子项的第一个定义:具有所有属性-->;
<;integerElement name="sharedchild"id="0x5211"precache="1"length="8"/>;
<;主元素>; < BR>
<;!--正确重用子元素-->;
<;主元素名称="parent2"id="0x5220">;
<;!--子项的第二个定义:仅需要名称(首选)或ID-->;
<;integerElement name="sharedchild"/>;
<;主元素>;
<;主元素名称="parent3"id="0x5230">;
<;!--子项的第三个定义:仅需要名称(首选)或ID-->;
<;integerElement id="0x5211"/>;
<;主元素>; < BR>
<;!--再利用不好!这将在分析架构时引发异常。---GT;
<;主元素名称="parent3"id="0x5230">;
<;!--重新定义错误:属性与初始定义冲突!---GT;
<;integerElement name="sharedchild"id="0xbad1d"/>;
<;主元素>;
<;架构>;
< BR>
**注意:**如上例所示,ebmlite允许一个ebml文档在其根级别有多个元素。其他一些ebml库也这样做,但这显然与官方规范背道而驰。正式地说,ebml文档应该只有一个根元素,类似于xml文件。 < BR>
埃布姆利特_
--
架构
"schema"类是用于对ebml文件进行编码和解码的工厂。初始化后,它会扫描架构文件,并为文件中的每个元素创建一个新类;然后,在编码或解码文件时,它会引用这些类,以便安全地封装所有内容。 < BR>
文件
``documents``是masterelements的子类,它充当ebml文件的接口并充当ebml树的根节点。每个"schema"还创建一个要使用的"document"子类,如果没有由"schema"定义的类变量,基"document"类将无法运行。 < BR>
实用程序
util.py提供的函数将向用户公开所需的大部分功能,而无需与此库进行太深入的接口。提供以下功能:
*util.*-toxml**(el,[父项=``none`,][偏移量=``true`,][大小=``true`,][类型=``true`,][id=``true`]):
递归地将ebml元素转换为xml元素。
参数*el*:ebml元素或文档。
可选参数*parent*:结果xml元素的父元素(如果有的话)。
可选参数*偏移量*:如果"true",则为
每个生成的xml元素,包含对应的ebml元素
偏移量。
可选参数*大小*:如果"true",则创建包含
对应的ebml元素大小。
可选参数*类型*:如果"true",则创建包含
相应ebml元素类型的名称。
可选参数*ids*:如果"true",则创建包含
对应的ebml元素的ebml id。
返回使用xml.etree.elementtree创建的XML树的根
内置类。 < BR>< BR>
*util.**xmlement2ebml**(xmlel,ebmlfile,schema,[sizelength=4,][unknown=true]):
今晚递归地将xml元素转换为ebml元素。
argument*xmrel*:xml元素。它的标记必须与
"架构"。
参数*ebmlfile*:打开的文件,如e流,ebml数据将
已写入。
参数*schema*:在编写
ebml文档。
可选参数*大小长度*:
可选参数*未知*:如果"true",则允许未知元素名称,
前提是它们的xml元素包含一个带有ebml的"id"属性
id(十六进制)。
返回编码元素的长度,包括头和子元素。
引发*nameerror*:如果架构中不存在xml元素并且
unknown为false,或者如果xml元素没有id。 < BR>< BR>
*util.*xml2ebml**(xmlfile,ebmlfile,schema,[sizelength=4,][headers=true,][unknown=true]):
参数*xmlfile*:XML源。可以是一个文件名,一个打开的文件,如
流或已解析的XML文档。
参数*ebml file*:要写入的ebml文件。可以是文件名或打开的
类似文件的流。
参数*模式*:要使用的ebml模式。可以是的文件名或实例
一个"模式"。
可选参数*size length*:每个元素大小的默认长度
描述符。必须足够大以存储最大的"master"元素。
如果xml元素有一个"sizeleng"属性,它将覆盖
这个。
可选参数*头*:如果"true",则生成标准的"ebml"
如果XML文档不包含元素。
可选参数*未知*:如果"true",则允许未知元素名称,
前提是它们的xml元素包含一个带有ebml的"id"属性
id(十六进制)。
返回ebml文件的大小(字节)。
引发nameerror:如果架构中不存在xml元素,则引发。 < BR>< BR>
*util.**loadXML**(xmlfile,schema,[ebmlfile=``none`]):
从xml文件加载ebml文档的有用实用程序。
参数*xmlfile*:XML源。可以是一个文件名,一个打开的文件,如
流或已解析的XML文档。
参数*模式*:要使用的ebml模式。可以是的文件名或实例
一个"模式"。
可选参数*ebml file*:要写入的临时ebml文件的名称,或
``:内存:``使用RAM(如'sqlite3`)。默认为
自动生成临时文件。
返回指定ebml文件的根节点 < BR>< BR>
*util.**pprint**:
测试函数递归地爬网ebml文档或元素并打印其
结构,显示缩进的子元素。
参数*el*:一个"document"或"element"子类的实例。
参数*值*:如果为"true",则显示元素值。
可选参数*out*:要写入的类似文件的流。
可选参数*缩进*:包含用于每个
缩进。 < BR>
也可以使用以下语法从命令行调用实用程序:
```命令行
python util.py{xml2ebml ebml2xml view}{file1.ebml file1.xml}schema.xml[-o{file2.xml file2.ebml}[-c--clobber[-p--pretty]

程序要求指定模式:xml2ebml、ebml2xml或view。前两种模式分别将xml文件转换为ebml文件和ebml文件转换为xml文件;最后一种模式将ide文件格式化为可读的。
file1:要转换/查看的ebml或xml文件的位置。
模式:解释这些文件时要使用的模式的位置。
file2:要输出到的位置;否则,输出将定向到控制台。
-c--clobber:如果文件2存在,则覆盖它,否则程序将失败。
-p--pretty:以人类可读的格式打印输出。 < BR>< BR> 做某事 [谚]
*完整的文档和示例代码。 <>*请参见python文件中的"@todo"项(即"core.py")。 < BR>< BR>< BR>

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
爪哇领导人选举   java查询MongoDB数组并使用最匹配的元素进行排序   java使用Maven在Tomcat上生成和访问WSDL   java从给定列表中做出不同的选择   java读取netflow/rflow(ddwrt)数据包内容   jaxb反序列化XML以在Java中动态创建类   通过Java执行的Curl命令在windows中有效,而不是在linux中   java同步方法是否阻止更新对象字段?   带有自定义适配器崩溃应用程序的java Android ListView   java字符串到字符串数组的转换   使用redis缓存java对象:为什么它比ConcurrentHashMap更好?   java再次加载jni库时会发生什么?   java ClassNotFoundException在JustSerialized类的反序列化期间发生