首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >generateDS停止处理子元素

generateDS停止处理子元素
EN

Stack Overflow用户
提问于 2019-05-06 21:08:21
回答 2查看 165关注 0票数 0

我有一个描述电子发票结构的xml模式。我已经使用模式和generateDS为该格式创建了一个解析器。在解析发票时,它看起来工作得很好,但在有任何键入内容的部分,它会在出现这些元素的位置停止处理childs。

描述任何元素的架构的一部分:

代码语言:javascript
复制
<!-- Elements to describe the invoice extensions -->
    <xs:complexType name="ExtensionRecord">
        <xs:sequence>
            <xs:element name="InformationName" type="NormalTextType" minOccurs="0"/>
            <xs:element name="InformationContent" type="LongTextType"/>
            <xs:element name="CustomContent" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:any processContents="skip"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="extensionId" type="ShortTextType" use="optional"/>
    </xs:complexType>

使用解析器的实现的相关部分:

代码语言:javascript
复制
E_Invoice = einvoice111.parseString(xmlString, silence=True)

for ai in E_Invoice.Invoice.AdditionalInformation:
    print(dir(ai) )
    print(dir(ai.CustomContent))
    print(ai.CustomContent.export(sys.stdout, 0, name_='CustomContent'))

有效负载XML的一部分:

代码语言:javascript
复制
    <AdditionalInformation extensionId="invoicePDFFormat">
      <InformationContent/>
      <CustomContent>
        <any>
          <Content>JVBERi0xLjQ........
                    <BASE64 coded binary>
        .....</Content>

以及该代码的输出:

代码语言:javascript
复制
['CustomContent', 'InformationContent', 'InformationName', 'Tag_strip_pattern_', '_FixedOffsetTZ', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'build', 'buildAttributes', 'buildChildren', 'convert_unicode', 'export', 'exportAttributes', 'exportChildren', 'extensionId', 'factory', 'gds_build_any', 'gds_encode', 'gds_format_base64', 'gds_format_boolean', 'gds_format_boolean_list', 'gds_format_date', 'gds_format_datetime', 'gds_format_double', 'gds_format_double_list', 'gds_format_float', 'gds_format_float_list', 'gds_format_integer', 'gds_format_integer_list', 'gds_format_string', 'gds_format_time', 'gds_parse_date', 'gds_parse_datetime', 'gds_parse_time', 'gds_reverse_node_mapping', 'gds_str_lower', 'gds_validate_base64', 'gds_validate_boolean', 'gds_validate_boolean_list', 'gds_validate_date', 'gds_validate_datetime', 'gds_validate_double', 'gds_validate_double_list', 'gds_validate_float', 'gds_validate_float_list', 'gds_validate_integer', 'gds_validate_integer_list', 'gds_validate_simple_patterns', 'gds_validate_string', 'gds_validate_time', 'get_CustomContent', 'get_InformationContent', 'get_InformationName', 'get_class_obj_', 'get_extensionId', 'get_path_', 'get_path_list_', 'hasContent_', 'original_tagname_', 'set_CustomContent', 'set_InformationContent', 'set_InformationName', 'set_extensionId', 'subclass', 'superclass', 'tzoff_pattern', 'validate_LongTextType', 'validate_NormalTextType', 'validate_ShortTextType']
['Tag_strip_pattern_', '_FixedOffsetTZ', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'anytypeobjs_', 'build', 'buildAttributes', 'buildChildren', 'convert_unicode', 'export', 'exportAttributes', 'exportChildren', 'factory', 'gds_build_any', 'gds_encode', 'gds_format_base64', 'gds_format_boolean', 'gds_format_boolean_list', 'gds_format_date', 'gds_format_datetime', 'gds_format_double', 'gds_format_double_list', 'gds_format_float', 'gds_format_float_list', 'gds_format_integer', 'gds_format_integer_list', 'gds_format_string', 'gds_format_time', 'gds_parse_date', 'gds_parse_datetime', 'gds_parse_time', 'gds_reverse_node_mapping', 'gds_str_lower', 'gds_validate_base64', 'gds_validate_boolean', 'gds_validate_boolean_list', 'gds_validate_date', 'gds_validate_datetime', 'gds_validate_double', 'gds_validate_double_list', 'gds_validate_float', 'gds_validate_float_list', 'gds_validate_integer', 'gds_validate_integer_list', 'gds_validate_simple_patterns', 'gds_validate_string', 'gds_validate_time', 'get_anytypeobjs_', 'get_class_obj_', 'get_path_', 'get_path_list_', 'hasContent_', 'original_tagname_', 'set_anytypeobjs_', 'subclass', 'superclass', 'tzoff_pattern']
<CustomContent/>

CustomContent有omittag,表示对象结构到此为止。我也尝试过export()整个文档,它也有同样的情况。

所以就是这个部分:

代码语言:javascript
复制
    <xs:complexType>
      <xs:sequence>
        <xs:any processContents="skip"/>
      </xs:sequence>
    </xs:complexType>

它不会出现在Python对象树中。

当我查看生成的与模式匹配的库时,CustomContent类的相关部分:

代码语言:javascript
复制
    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
        obj_ = self.gds_build_any(child_, 'CustomContentType')
        if obj_ is not None:
            self.set_anytypeobjs_(obj_)

它使用gds_build_any()方法,而不是创建从模式生成的类的新实例(该实例也不存在)。

在使用Suds时,我可以访问any元素及其内容,但它会在其他地方中断。

有没有办法将generateDS配置为:

  • 创建到所有架构的类到整个文档的elements?
  • use这些类?
EN

回答 2

Stack Overflow用户

发布于 2019-05-10 03:44:00

好吧,至少看起来generateDS.py SAX处理程序XschemaHandler在1652行测试:

代码语言:javascript
复制
    if name == AnyType:
        element = XschemaElement(attrs)
        element.type = AnyTypeIdentifier
        self.stack.append(element)

以及要标记的机器(AnyType包含'xs:any')。因此,GDS知道任何标签都是特殊的XML语法,比如'sequence','simpleType','complexType‘等。

这可能就是为什么它不尝试为它创建一个类并将它映射到“any”的原因。

我对它做了一些修改:

代码语言:javascript
复制
    elif name == AnyType:
        print('opening AnyType')
        element = XschemaElement(attrs)
        element.name = 'any'
        #element.type = 'NormalTextType'
        element.type = 'StringType'
        self.inAnyType = 1
        self.stack.append(element)

并类似于sax结束标签,添加到标签内容处理部分:

代码语言:javascript
复制
    def characters(self, chrs):
        if self.inDocumentationType:
            # If there is an annotation/documentation element, save it.
            if len(self.stack) > 1 and len(chrs) > 0:
                self.stack[-1].documentation += chrs
        elif self.inAnyType:
            if len(self.stack) > 1 and len(chrs) > 0:
                self.stack[-1].any += chrs
        elif self.inElement:
            pass

现在我得到的输出是:

代码语言:javascript
复制
    <CustomContent>
        <any>

              </any>
    </CustomContent>

很接近但没有雪茄。

票数 0
EN

Stack Overflow用户

发布于 2019-05-11 03:33:16

好吧,尝试了所有的方法,并提出了更改,以便我可以阅读任何内容(不确定我是否知道我在做什么):

代码语言:javascript
复制
$ hg diff generateDS.py | wc -l
78

唯一的问题是我的XML里面有base64编码的文本。看起来是这样的:

代码语言:javascript
复制
    <AdditionalInformation extensionId="invoicePDFFormat">
      <InformationContent/>
      <CustomContent>
        <any>
          <Content>JVBERi0xLjQNCiXi48/TDQoxIDAgb2JqDQo8PC9UeXBlIC9Gb250IC9TdWJ0eXBlIC9UeXBlMQ0K
L0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcgL0Jhc2VGb250IC9Db3VyaWVyID4+DQplbmRvYmoN
CjIgMCBvYmoNCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggOTIgPj4NCnN0cmVhbQ0K
eJwz0DNVMIDionQFpxAuAwVDBV1DBQMFUwUTAwOFkFwu/WAPUyAvJA0oF1IMlAkpAhHJIKKcS8NV

但在GDS处理之后,它看起来如下所示:

代码语言:javascript
复制
          JVBERi0xLjQNCiXi48/TDQoxIDAgb2JqDQo8PC9UeXBlIC9Gb250IC9TdWJ0eXBlIC9UeXBlMQ0K

L0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcgL0Jhc2VGb250IC9Db3VyaWVyID4+DQplbmRvYmoN

CjIgMCBvYmoNCjw8IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIC9MZW5ndGggOTIgPj4NCnN0cmVhbQ0K

我使用以下命令获取元素中的文本内容:

代码语言:javascript
复制
self.any = ''.join(node.itertext())

即使我只使用node.text也无关紧要,它里面有空行。这仍然是一个未解之谜。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56005920

复制
相关文章

相似问题

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