XMLParser пропускает атрибуты при разборе файла схемы XML - PullRequest
0 голосов
/ 26 сентября 2019

Мне нужно прочитать файл схемы XML и извлечь только те элементы, которые имеют поле minOccurs="0".Но я сталкиваюсь с проблемой, когда анализатор XML пропускает эти поля при анализе документа.

Это так же, как я покажу вам в коде ниже.

У меня есть пример XML-файла:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
    <xsd:include schemaLocation="def.xml"/>
    <xsd:element name="MainElementName">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="A">
                    <xsd:complexType>
                        <xsd:attribute name="AA" required="False" type="string"/>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="B" minOccurs="0" maxOccurs="unbounded">
                    <xsd:complexType>
                        <xsd:attribute name="BA" type="string"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Затем я анализирую его с помощью этого кода:

    with open(xsd_path, 'r'):
        try:
            parser = et.XMLParser(remove_blank_text=True)
            tree = et.parse(xsd_path, parser)
            tmp_text = et.tostring(tree, pretty_print=True, encoding=str)
        except IOError as e:
            print(e)

И я получаю вывод:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
    <xsd:include schemaLocation="def.xml"/>
    <xsd:element name="MainElementName">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="A">
                    <xsd:complexType>
                        <xsd:attribute name="AA" type="string"/>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="B">
                    <xsd:complexType>
                        <xsd:attribute name="BA" type="string"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Я не знаю, почему анализатор пропускает поле required в атрибуте и min/maxOccurs в элементе.Кто-нибудь знает, как это решить?

1 Ответ

1 голос
/ 26 сентября 2019

Ваш код неверен, я не смог его скомпилировать.Например, ElementTree.tostring() принимает экземпляр Element, но вы передаете экземпляр ElementTree (tree).

Этот код работает для меня:

import xml.etree.ElementTree as et

parser = et.XMLParser()
tree = et.parse('/path/to.xml', parser)
tmp_text = et.tostring(tree.getroot(), encoding='unicode')
print(tmp_text)

С Python 3.6.8 вывод:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation="def.xml" />
    <xs:element name="MainElementName">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="A">
                    <xs:complexType>
                        <xs:attribute name="AA" required="False" type="string" />
                    </xs:complexType>
                </xs:element>
                <xs:element maxOccurs="unbounded" minOccurs="0" name="B">
                    <xs:complexType>
                        <xs:attribute name="BA" type="string" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
...