半结构化xml到dict

ssxtd的Python项目详细描述


半结构化xml到dict

SSXTD是与XMLtoDICT相似的XMLRead,但支持半结构化XML,并提供更灵活的环境。 ssxtd使用以下任一项:

  • 本机XML包
  • lxml包
  • defusedxml包

在全局范围内,坚持使用本机xml包。在大多数情况下是最快的。

注意:创建ssxtd是为了解析非常大的文件,因此,默认解析深度为2,解析函数是生成器。

快速启动

pip install ssxtd
from ssxtd import parsers
result = next(parsers.xml_parse(my_file, depth=0))

如果…

…我想解析大文件?

使用:
parsers.xml_iterparse(my_file)

注意:默认情况下,它将返回深度2元素。

…我的XML文件混合了标记和文本?

ssxtd将自动将混合标记和文本转换为字符串,并保持正确的顺序。

…我想使用defusedxml来保护我的应用程序?

使用:
parsers.dxml_parse(my_file)

parsers.dxml_iterparse(my_file)

…我想用lxml?

使用:
parsers.lxml_parse(my_file)

parsers.lxml_iterparse(my_file)

注意:它将比xml解析和xml iterparse慢

选项

深度

即使不使用iterparse,也可以调整返回对象的深度级别。

注意:使用iterparse时不能使用depth=0

修剪空间

将为找到的每个值修剪空格。当您有一些难看的xml时,例如:

<root>
  <text>we have
  some indentation
  problems
  </text>
</root>

del_empty(默认为true)

如果设置为false,则不会删除空标记

清除命名空间

如果设置为false,则不会删除命名空间

详细

如果设置为true,将显示一个进度条\o/

恢复

如果设置为true,将从格式错误的xml恢复(cf test_malformed_xml.py)

注意:lxml_parse和lxml_iterparse将使用lxml能力,而其他的将使用美化组转换

压缩

ssxtd可以管理zip、gzip、byteio和文件路径

对于zip和gzip,必须将参数“compression”设置为“gz”或“zip”

parsers.xml_parse(my_file, compression="gz"):

您还可以将参数设置为“auto”,然后ssxtd将自动检测扩展名(.xml、.zip或.gz)中的文件类型

注意:ATM在ZIP压缩模式下,只读取位于ZIP文件根目录下的.xml文件

对象处理器

如果在调用解析器时指定参数“object_processor=my_function”,则将为每个对象调用函数

see bin/run_exemple.py

允许在解析过程中执行特殊操作,如直接合并标记

值处理器

如果在调用解析器时指定参数“value_processor=my_function”,则将为找到的每个值调用函数

例如简单的类型转换:

def try_conversion(value):
        try:
            return int(value)
        except (ValueError, TypeError):
            pass
        try:
            return float(value)
        except (ValueError, TypeError):
            pass
        return value

要求

Python

python>;=v3.7.0b1
由于https://github.com/python/cpython/commit/066df4fd454d6ff9be66e80b2a65995b10af174f
您可以使用旧版本的pythons(我测试了3.5版本),但无法读取zip文件

libs

  • BS4
  • 全面质量管理

运行测试

安装pytest:
pip install pytest
在根目录中,运行:
pytest
要运行单个文件,请将自己放在根文件夹中,然后运行:
python -c "import ssxtd.tests.test_malformed_xml"

解析函数的性能

分析https://ftp.ncbi.nlm.nih.gov/pubmed/baseline/pubmed19n0001.xml.gz
gz文件大小:19mb
提取大小:185mb
程序:i7-7700hq

FunctionXML fileGZ fileZIP file (no compression)
xml_parse32.7650154500006536.0771533999995933.419777400000385
xml_iterparse37.5602848000016842.1627983500002339.137448499999664
lxml_parse37.46477625000079638.88001149999945537.046347550000064
lxml_iterparse47.0402444999999745.95942104999994645.05521540000154
dxml_parse41.5206383000004340.0763293500003838.88691465000011
dxml_iterparse45.19527319999906544.89578400000027644.13825424999959

有关更多详细信息,请参见ssxtd\benchmarks\results\result.csv

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

推荐PyPI第三方库


热门话题
JavaAkka参与者工具包上下文。ActorofVS系统。阿克特罗夫   java快速查看是否未选中所有复选框的方法   使用JLabel添加图片时遇到的java问题   java如何在SpringRestTemplate中自定义自动封送以生成/修改XML头(编码,DOCTYPE)   java Exchange Web服务(EWS)使用令牌凭据进行单点登录?   java无法从@Transaction中具有关系的两个表中删除   多线程处理我的代码只有在通过java完成处理后才能继续   java FileNotFoundException:[excel在本地计算机上的位置]文件名、目录名或卷标语法不正确   java JPanel不会显示在另一个JPanel之上   从Eclipse构建器运行Java程序   java根据状态更改记录器级别   在Java中,如何使用日志。e(或任何函数)列出代码中使用的所有变量   java 21点极小极大算法   java NullPointerException@Googlemap lambda表达式?(gMapsfx)   java如何运行。从转换的exe文件。使用不带Jre的Launch4J工具的jar文件   java将非实质性的Swing插件加载到Eclipse