Как получить все различия проверки при сравнении файла XML с файлом XSD - PullRequest
0 голосов
/ 20 февраля 2020

Я пытался найти подтверждение файла XSD с файлом XML. Но, к сожалению, я получаю только первое отличие при проверке файлов. Я использую asssertValid (), который дает только первое отличие, то есть "Панель" из файла. Следует найти все различия, т. Е. «Панель» и «Подпанель». Я хочу, чтобы все различия валидации в файле журнала. Не могли бы вы помочь мне найти все различия.

Python Код

from lxml import etree
import traceback

def validate_xml_and_xsd_files(xml_path: str, xsd_path: str):
    result = False
    try:
       xmlschema_doc = etree.parse(xsd_path)
       xmlschema = etree.XMLSchema(xmlschema_doc)
       xml_doc = etree.parse(xml_path)
       result = xmlschema.validate(xml_doc)
       xmlschema.assertValid(xml_doc)
    except Exception as ex:
       print("Exception raised-->", ''.join(traceback.format_exception(etype=type(ex), value=ex, tb=ex.__traceback__)))
    finally:
       return result


 if __name__ == "__main__":
     file_path = "C:\\Users\\"
     source_file_path = file_path + 'outputmetadata.xml'
     schema_file_path = file_path + 'XMLValidator.xsd'

     if validate_xml_and_xsd_files(source_file_path, schema_file_path):
         print('Validation Successful w.r.t XML and XSD files.')
     else:
         print('Validation Unsuccessful w.r.t XML and XSD files')

XML Файл

<?xml version="1.0" encoding="UTF-8"?>
<dataFeedDeliveryMetaData>
    <source>
            <setting name="countryCode" serializeAs="String">
                    <value>IND</value>
            </setting>
            <setting name="startDateOfData" serializeAs="String">
                    <value>2012/12/31</value>
            </setting>
            <setting name="endDateOfData" serializeAs="String">
                    <value>2013/03/24</value>
            </setting>
            <setting name="currency" serializeAs="String">
                    <value>INR</value>
            </setting>
    </source>
    <delivery>
            <panels>
                    <panel>
                            <setting type="PersonName">Vikas</setting>
                            <setting type="Gender">Male</setting>
                    </panel>
                    <panel>
                            <setting type="PersonName">Akash</setting>
                            <setting type="Gender">Male</setting>
                    </panel>
                    <pane>
                            <setting type="PersonName">Divya</setting>
                            <setting type="Gender">Female</setting>
                    </pane>
                    <subpanel>
                            <setting type="PersonName">Manikanta</setting>
                            <setting type="Gender">Male</setting>
                    </subpanel>

            </panels>
            <setting name="JobType" serializeAs="String">
                    <value>FullTime</value>
            </setting>
    </delivery>

XSD файл

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="dataFeedDeliveryMetaData">
<xs:complexType>
  <xs:sequence>
    <xs:element name="source">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="setting" maxOccurs="4" minOccurs="4">
            <xs:complexType>
              <xs:sequence>
                <xs:element type="xs:string" name="value"/>
              </xs:sequence>
              <xs:attribute name="name" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                         <xs:enumeration value="countryCode"/>
                         <xs:enumeration value="startDateOfData"/>
                         <xs:enumeration value="endDateOfData"/>
                         <xs:enumeration value="currency"/>
                    </xs:restriction>
                </xs:simpleType>
              </xs:attribute>                      
              <xs:attribute type="xs:string" name="serializeAs" use="optional"/>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
      <xs:unique name="settingNameAttribute">
        <xs:selector xpath="setting"/>
        <xs:field xpath="@name"/>
      </xs:unique>
    </xs:element>
    <xs:element name="delivery">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="panels">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="panel" minOccurs="3" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element name="setting" maxOccurs="2" minOccurs="2">
                        <xs:complexType>
                          <xs:simpleContent>
                            <xs:extension base="xs:string">
                              <xs:attribute name="type" use="required">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                         <xs:enumeration value="PersonName"/>
                                         <xs:enumeration value="Gender"/>
                                    </xs:restriction>
                                </xs:simpleType>
                              </xs:attribute>
                            </xs:extension>
                          </xs:simpleContent>
                        </xs:complexType>
                      </xs:element>
                    </xs:sequence>
                  </xs:complexType>
                  <xs:unique name="panelTypeAttribute">
                    <xs:selector xpath="setting"/>
                    <xs:field xpath="@type"/>
                  </xs:unique>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="setting" maxOccurs="2" minOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element type="xs:string" name="value"/>
              </xs:sequence>
              <xs:attribute name="name" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                         <xs:enumeration value="JobType"/>
                    </xs:restriction>
                </xs:simpleType>
              </xs:attribute>
              <xs:attribute type="xs:string" name="serializeAs" use="optional"/>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

Выход

Unable to get all difference pane and subpanel from xml file

...