首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用存储在Odoo模块中的多个XSD验证XML

如何使用存储在Odoo模块中的多个XSD验证XML
EN

Stack Overflow用户
提问于 2022-05-17 22:59:40
回答 1查看 83关注 0票数 0

我需要验证我用提供的两个XSD文件生成的xml。我正在挣扎,因为其中一个XSD文件引用了另一个文件,而且看起来我正因为这个而得到错误。

以下是“发票模式”:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<!-- XSD ver.23/08/2021 -->
<xs:schema xmlns:ds="http://www.w3.org/2000/09/xmldsig#" attributeFormDefault="unqualified"
           elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="../SignatureSchema.xsd"/>
    <xs:element name="facturaElectronicaCompraVenta">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="cabecera">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="nitEmisor">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="1"/>
                                        <xs:maxInclusive value="9999999999999"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="razonSocialEmisor">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="200"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="municipio">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="25"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="telefono" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="25"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="numeroFactura">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="1"/>
                                        <xs:maxInclusive value="9999999999"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="cuf">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="100"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="cufd">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="100"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoSucursal">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="0"/>
                                        <xs:maxInclusive value="9999"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="direccion">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="500"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoPuntoVenta" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="0"/>
                                        <xs:maxInclusive value="9999"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="fechaEmision" type="xs:dateTime"/>
                            <xs:element name="nombreRazonSocial" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="500"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoTipoDocumentoIdentidad">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="1"/>
                                        <xs:maxInclusive value="5"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="numeroDocumento">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="20"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="complemento" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:maxLength value="5"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoCliente">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="100"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoMetodoPago">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="1"/>
                                        <xs:maxInclusive value="308"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="numeroTarjeta" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="0"/>
                                        <xs:maxInclusive value="9999999999999999"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="montoTotal">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minExclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="montoTotalSujetoIva">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minInclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoMoneda">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="1"/>
                                        <xs:maxInclusive value="154"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="tipoCambio">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minExclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="montoTotalMoneda">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minExclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="montoGiftCard" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minInclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="descuentoAdicional" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minInclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoExcepcion" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="0"/>
                                        <xs:maxInclusive value="1"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="cafc" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="50"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="leyenda">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="200"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="usuario">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="100"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoDocumentoSector" type="xs:integer" fixed="1"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="detalle" minOccurs="1" maxOccurs="500">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="actividadEconomica">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="10"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoProductoSin">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="1"/>
                                        <xs:maxInclusive value="99999999"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="codigoProducto">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="50"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="descripcion">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="1"/>
                                        <xs:maxLength value="500"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="cantidad">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minExclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="unidadMedida">
                                <xs:simpleType>
                                    <xs:restriction base="xs:integer">
                                        <xs:minInclusive value="1"/>
                                        <xs:maxInclusive value="86"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="precioUnitario">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minExclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="montoDescuento" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minInclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="subTotal">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:totalDigits value="17"/>
                                        <xs:fractionDigits value="2"/>
                                        <xs:minExclusive value="0"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="numeroSerie" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="0"/>
                                        <xs:maxLength value="1500"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                            <xs:element name="numeroImei" nillable="true">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:minLength value="0"/>
                                        <xs:maxLength value="1500"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element ref="ds:Signature"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

以下是“签名模式”:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://www.w3.org/2000/09/xmldsig#" attributeFormDefault="unqualified"
           elementFormDefault="qualified" targetNamespace="http://www.w3.org/2000/09/xmldsig#"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Signature">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="SignedInfo">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="CanonicalizationMethod">
                                <xs:complexType>
                                    <xs:attribute name="Algorithm" type="xs:string" use="required"/>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="SignatureMethod">
                                <xs:complexType>
                                    <xs:attribute name="Algorithm" type="xs:string" use="required"/>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="Reference">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="Transforms">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element maxOccurs="unbounded" name="Transform">
                                                        <xs:complexType>
                                                            <xs:attribute name="Algorithm" type="xs:string"
                                                                          use="required"/>
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="DigestMethod">
                                            <xs:complexType>
                                                <xs:attribute name="Algorithm" type="xs:string" use="required"/>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="DigestValue" type="xs:string"/>
                                    </xs:sequence>
                                    <xs:attribute name="URI" type="xs:string" use="required"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="SignatureValue" type="xs:string"/>
                <xs:element name="KeyInfo">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="X509Data">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="X509Certificate" type="xs:string"/>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

“发票模式”将命名空间"schemaLocation“的”签名模式“引用到以下位置”./SignatureSchema.xsd“。我正在使用Odoo,并将“发票模式”文件存储在“MyModule/data/xsd/sale”和"Signature“uder "MyModule/data/xsd/”下。

因此,我使用以下代码验证我的文件:

代码语言:javascript
运行
复制
    def _validate_invoice_xml(self):
        root = self._get_xml_tree_root()
        # Validate generated xml
        xsd_file_path = get_module_resource('MyModule', 'data/xsd/sale_purchase', 'InvoiceSchema.xsd')
        with open(xsd_file_path) as xsd_file:
            invoice_schema = xsd_file.read()
        # Decode XSD file
        invoice_xsd = ET.fromstring(invoice_schema.encode('ascii'))
        xmlschema = ET.XMLSchema(invoice_xsd)
        validation_result = xmlschema.validate(root)
        if not validation_result:
            log = xmlschema.error_log
            error = log.last_error
            raise exceptions.ValidationError('XML file validation error:' + '\n' + str(error.message))

但是,当我运行我的代码时,我会得到以下错误:

代码语言:javascript
运行
复制
lxml.etree.XMLSchemaParseError: Element '{http://www.w3.org/2001/XMLSchema}element', attribute 'ref': The QName value '{http://www.w3.org/2000/09/xmldsig#}Signature' does not resolve to a(n) element declaration., line 344

我认为该错误与使用schemaLocation=“./SignatureSchema.xsd”引用"Signaute模式“有关。但我不确定这些文件应该放在哪里。

为什么我要得到这个错误,我如何避免它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-18 15:37:52

正如Michael评论的那样,我需要获得XSD文件的绝对路径。在odoo中,我通过使用以下代码成功地做到了这一点:

代码语言:javascript
运行
复制
import os

# This gets the location of the absolute location of the python file running
current_location = os.path.dirname(os.path.realpath(__file__))
# Replacing part of the path to point to the XSD file location
schema_file_location = current_location.replace('models', 'data/pathToMyXSDfile.xsd')
# Validate XML file
xsd_file = ET.parse(schema_file_location)
xmlschema = ET.XMLSchema(xsd_file)
validation_result = xmlschema.validate(root)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72281557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档