我有一个xsd模式文件,其中包括以下定义:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
<xs:element name="CreateDate" minOccurs="0" maxOccurs="1">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:minLength value="8"/>
            <xs:maxLength value="10"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>
...

以及包含以下元素的XML文件:

<?xml version="1.0" encoding="utf-8"?>
...
<!-- format is: YYYY/dd/mm -->
<CreateDate>2020/10/22</CreateDate>
...

我使用xmlschema来解析该XML文件,如下所示:

schema = xmlschema.XMLSchema(schema_file)
element = schema.to_dict(xml_file, datetime_types=True)

显然,CreateDate被解析为字符串,而不是Date对象.问题:

  1. 是否可以更改xsd定义,以便xmlschema使用格式"YYYY/mm/dd"自动解析CreateDateDate
  2. 如果不是,我想我需要使用value_hookelement_hook个参数截取to_dict()的解析,但我不确定如何进行.有什么建议吗?

推荐答案

我只在iter_decode上找到了钩子选项,以下是一个仅假设单个元素模式和实例的示例:

from pprint import pprint

import xmlschema

from elementpath import datatypes

from datetime import datetime

schema = xmlschema.XMLSchema('schema1.xsd')

def my_element_hook(elementData, xsdElement, xsdType):
    thisDate = datetime.strptime(elementData.text, '%Y/%m/%d')
    return xmlschema.ElementData(tag=elementData.tag,text=datatypes.Date10(thisDate.year, thisDate.month, thisDate.day),attributes=None,content=None)


for value in schema.iter_decode('sample1.xml',datetime_types=True,element_hook=my_element_hook):
    pprint(value)

对于示例sample1.xml,如

<?xml version="1.0" encoding="utf-8"?>
<!-- format is: YYYY/mm/dd -->
<CreateDate>2020/10/22</CreateDate>

和一个模式

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="CreateDate">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:minLength value="8"/>
            <xs:maxLength value="10"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

</xs:schema>

比方说我得Date10(2020, 10, 22)分.

对于更复杂的模式,我想元素挂钩需要为您不想操作的元素返回elementData,然后对于elementData.tag = 'CreateDate',使用所提供的代码.

def my_element_hook(elementData, xsdElement, xsdType):
    if elementData.tag == 'CreateDate':
        thisDate = datetime.strptime(elementData.text, '%Y/%m/%d')
        return xmlschema.ElementData(tag=elementData.tag,text=datatypes.Date10(thisDate.year, thisDate.month, thisDate.day),attributes=None,content=None)
    else:
        return elementData

Python相关问答推荐

仅从风格中获取 colored颜色 循环

在Pandas DataFrame操作中用链接替换'方法的更有效方法

从numpy数组和参数创建收件箱

对所有子图应用相同的轴格式

pyscript中的压痕问题

关于Python异步编程的问题和使用await/await def关键字

如何保持服务器发送的事件连接活动?

干燥化与列姆化的比较

用SymPy在Python中求解指数函数

GPT python SDK引入了大量开销/错误超时

使用嵌套对象字段的Qdrant过滤

仅使用预先计算的排序获取排序元素

如何使用pytest在traceback中找到特定的异常

如何获得满足掩码条件的第一行的索引?

在pandas中,如何在由两列加上一个值列组成的枢轴期间或之后可靠地设置多级列的索引顺序,

设置索引值每隔17行左右更改的索引

Pythonquests.get(Url)返回Colab中的空内容

为什么我只用exec()函数运行了一次文件,而Python却运行了两次?

如何在Pandas中用迭代器求一个序列的平均值?

仅取消堆叠最后三列