这几天要做一个检测XML文档语法的作用,根据XSD界定好的标准开展匹配检测:

XML在其中一条纪录(在其中“NUID”这一项刻意改不正确用于检测):

<Record ChipsetType="xxxxxxxxx" ChipsetExtension="xRxDxxx" ChipsetCut="80" NUID="ZE2D6525" NUIDCheckNumber="18CEBD29" STB_CA_SN="89349247" DeviceManufacturerSN="JC1S03200002" CSCDataConfig="030404DC" CSCDataRevisionNumber="00000000" CSCDataCheckNumber="39C5D43E" CERTReportCheckNumber="FE404962A674CA06" PersonalizationDate="2020/08/18 16:57" CRC="6A4092E0" />

XSD在其中一部分标准界定以下(关键拿“NUID ”这一项做检测):

<!--*************************************************************************-->
<!-- Define new type LogRecordType                                           -->
<!--*************************************************************************-->
<xs:complexType name="RecordType">
	<xs:attribute name="ChipsetType" type="String20Type" use="required"/>
	<xs:attribute name="ChipsetExtension" type="String20Type" use="required"/>
	<xs:attribute name="ChipsetCut" type="String20Type" use="required"/>
	<xs:attribute name="NUID" type="Int32Type" use="required"/>
	<xs:attribute name="NUIDCheckNumber" type="Int32Type" use="required"/>
	<xs:attribute name="STB_CA_SN" type="Int32Type" use="required"/>
	<xs:attribute name="CSCDataConfig" type="Int32Type" use="required"/>
	<xs:attribute name="CSCDataRevisionNumber" type="Int32Type" use="required"/>
	<xs:attribute name="CSCDataCheckNumber" type="Int32Type" use="required"/>
	<xs:attribute name="CERTReportCheckNumber" type="Int64Type" use="required"/>
	<xs:attribute name="DeviceManufacturerSN" type="String30Type" use="required"/>
	<xs:attribute name="PersonalizationDate" type="nvdateType" use="required"/>
	<xs:attribute name="CRC" type="Int32Type" use="required"/>
</xs:complexType>


<!--*************************************************************************-->
<!-- Define new type Int32Type                                               -->
<!--*************************************************************************-->
<xs:simpleType name="Int32Type">
	  <xs:restriction base="xs:string">
			<xs:pattern value="([A-Fa-f0-9]{8})"/>
	  </xs:restriction>
</xs:simpleType>

完成编码以下:

import lxml.etree as ET

def validateXMLByXSD(file_xml, file_xsd):
        """ Verify that the XML compliance with XSD
        Arguments:
            1. file_xml: Input xml file
            2. file_xsd: xsd file which needs to be validated against xml
        Return:
            No return value
        """
        try:
            print("Validating:{0}".format(file_xml))
            print("xsd_file:{0}".format(file_xsd))
            xml_doc = ET.parse(file_xml)
            xsd_doc = ET.parse(file_xsd)
            xmlschema = ET.XMLSchema(xsd_doc)
            xmlschema.assert_(xml_doc)
            return True

        except ET.XMLSyntaxError as err:
            print("PARSING ERROR:{0}".format(err))
            return False

        except AssertionError as err:
            print("Incorrect XML schema: {0}".format(err))
            return False

最终检测輸出結果以下,的确查验出了XML不合理合法的项:

Incorrect XML schema: Element 'Record', attribute 'NUID': [facet 'pattern'] The value 'ZE2D6525' is not accepted by the pattern '([A-Fa-f0-9]{8})'., line 9
文章来源于网络 ,如有侵权请联系站长QQ61910465删除
本文版权归去快排Seo www.SEOgurublog.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系QQ▷61910465