def test_xpath(self): """ 根据给定的xpath查询语句, 查询出合适的节点 :return: """ xml = CXml() xml_comment = u'<root name="hello world"><element name="zg">hello</element></root>' xml.load_xml(xml_comment) xmlString = xml.to_xml() result = xml.xpath_one('./element') assert CXml.get_element_xml(result) == '<element name="zg">hello</element>'
def test_to_xml(self): """ 通过给定的xml内容, 对xml对象进行初始化 :return: """ xml = CXml() xml_content = ''' <root><element>hello</element></root> ''' xml.load_xml(xml_content) xml_string = xml.to_xml() assert xml_string == '<root><element>hello</element></root>'
def init_metadata_bus(self, parser: CMetaDataParser) -> str: """ 通过相应信息转换xml """ file_main_name = parser.file_info.file_main_name file_path = parser.file_info.file_path xml_obj = CXml() # 建立xml对象 node_root = xml_obj.new_xml('root') node_item1 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item1, self.Name_Name, 'ProductName') xml_obj.set_element_text(node_item1, file_main_name) # 设置item节点与属性与内容 pathdata_list = re.findall( r'(?i)(\d{4}.{2})[\\\\/]FenFu', file_path ) if len(pathdata_list) > 0: pathdata = CUtils.any_2_str(pathdata_list[0]) else: pathdata = '' node_item2 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item2, self.Name_Name, 'DataDate') xml_obj.set_element_text(node_item2, pathdata) # 设置item节点与属性与内容 pixelsize_value = parser.metadata.metadata_json().xpath_one('pixelsize.width', None) if pixelsize_value is not None: pixelsize_num = CUtils.to_decimal(pixelsize_value, None) if pixelsize_num is not None: if CUtils.to_decimal(pixelsize_value, 0) < 0.01: pixelsize_value = pixelsize_num * 110000 else: pixelsize_value = '' else: pixelsize_value = '' pixelsize_value = CUtils.any_2_str(pixelsize_value) if len(pixelsize_value) > 10: pixelsize_value = pixelsize_value[:10] node_item3 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item3, self.Name_Name, 'Resolution') xml_obj.set_element_text(node_item3, pixelsize_value) # 设置item节点与属性与内容 SatelliteID = '' node_item4 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item4, self.Name_Name, 'SatelliteID') xml_obj.set_element_text(node_item4, SatelliteID) # 设置item节点与属性与内容 GeographicName = '' node_item5 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item5, self.Name_Name, 'GeographicName') xml_obj.set_element_text(node_item5, GeographicName) # 设置item节点与属性与内容 node_item6 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item6, self.Name_Name, 'Description') xml_obj.set_element_text(node_item6, '') # 设置item节点与属性与内容 try: if xml_obj is not None: parser.metadata.set_metadata_bus( self.Success, '元数据文件成功构建! ', self.MetaDataFormat_XML, xml_obj.to_xml() ) return CResult.merge_result( self.Success, '元数据文件成功构建! ' ) else: raise except Exception as error: parser.metadata.set_metadata_bus( self.Exception, '构建元数据文件失败, 无法处理! 错误原因为{0}'.format(error.__str__()), self.MetaDataFormat_Text, '' ) return CResult.merge_result( self.Exception, '构建元数据文件失败, 无法处理! 错误原因为{0}'.format(error.__str__()) )
def init_metadata_bus(self, parser: CMetaDataParser) -> str: """ 通过相应信息转换xml """ file_main_name = parser.file_info.file_main_name file_path = parser.file_info.file_path xml_obj = CXml() # 建立xml对象 node_root = xml_obj.new_xml('root') node_item1 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item1, self.Name_Name, 'ProductName') xml_obj.set_element_text(node_item1, file_main_name) # 设置item节点与属性与内容 if CUtils.text_match_re(file_main_name, r'.*_\d{6,8}_.{3}_.*_' + self.get_coordinate_system()): pathdata_list = re.findall( r'.*_(\d{6,8})_.{3}_.*_' + self.get_coordinate_system(), file_main_name ) if len(pathdata_list) > 0: pathdata = CUtils.any_2_str(pathdata_list[0]) else: pathdata = '' else: pathdata_list = re.findall( r'(?i)(\d{4}.{2})[\\\\/]镶嵌影像成果', file_path ) if len(pathdata_list) > 0: pathdata = CUtils.any_2_str(pathdata_list[0]) else: pathdata = '' node_item2 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item2, self.Name_Name, 'DataDate') xml_obj.set_element_text(node_item2, pathdata) # 设置item节点与属性与内容 if CUtils.text_match_re(file_main_name, r'.*_\d{6,8}_.{3}_.*_' + self.get_coordinate_system()): pixelsize_list = re.findall( r'.*_\d{6,8}_.{3}_(.*)_' + self.get_coordinate_system(), file_main_name ) if len(pathdata_list) > 0: pixelsize = CUtils.any_2_str(pixelsize_list[0]) else: pixelsize = '' elif CUtils.text_match_re(file_main_name, r'.*_.{3}_.*_' + self.get_coordinate_system()): pixelsize_list = re.findall( r'.*_.{3}_(.*)_' + self.get_coordinate_system(), file_main_name ) if len(pathdata_list) > 0: pixelsize = CUtils.any_2_str(pixelsize_list[0]) else: pixelsize = '' else: pixelsize = '' if CUtils.text_match_re(pixelsize, r'^\d+[a-zA-z]+$'): pixelsize_list = re.findall(r'(\d+)[a-zA-z]+', pixelsize) if len(pathdata_list) > 0: pixelsize = CUtils.any_2_str(pixelsize_list[0]) if len(pixelsize) == 2: pixelsize_value = '{0}.{1}'.format(pixelsize[:1], pixelsize[-1:]) else: pixelsize_value = pixelsize node_item3 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item3, self.Name_Name, 'Resolution') xml_obj.set_element_text(node_item3, pixelsize_value) # 设置item节点与属性与内容 if CUtils.text_match_re(file_main_name, r'.*_\d{6,8}_.{3}_.*_' + self.get_coordinate_system()): SatelliteID_list = re.findall( r'.*_\d{6,8}_(.{3})_.*_' + self.get_coordinate_system(), file_main_name ) if len(pathdata_list) > 0: SatelliteID = CUtils.any_2_str(SatelliteID_list[0]) else: SatelliteID = '' elif CUtils.text_match_re(file_main_name, r'.*_.{3}_.*_' + self.get_coordinate_system()): SatelliteID_list = re.findall( r'.*_(.{3})_.*_' + self.get_coordinate_system(), file_main_name ) if len(pathdata_list) > 0: SatelliteID = CUtils.any_2_str(SatelliteID_list[0]) else: SatelliteID = '' else: SatelliteID = '' node_item4 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item4, self.Name_Name, 'SatelliteID') xml_obj.set_element_text(node_item4, SatelliteID) # 设置item节点与属性与内容 if CUtils.text_match_re(file_main_name, r'.*_\d{6,8}_.{3}_.*_' + self.get_coordinate_system()): GeographicName_list = re.findall( r'(.*)_\d{6,8}_.{3}_.*_' + self.get_coordinate_system(), file_main_name ) if len(pathdata_list) > 0: GeographicName = CUtils.any_2_str(GeographicName_list[0]) else: GeographicName = '' elif CUtils.text_match_re(file_main_name, r'.*_.{3}_.*_' + self.get_coordinate_system()): GeographicName_list = re.findall( r'(.*)_.{3}_.*_' + self.get_coordinate_system(), file_main_name ) if len(pathdata_list) > 0: GeographicName = CUtils.any_2_str(GeographicName_list[0]) else: GeographicName = '' else: GeographicName = '' node_item5 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item5, self.Name_Name, 'GeographicName') xml_obj.set_element_text(node_item5, GeographicName) # 设置item节点与属性与内容 node_item6 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item6, self.Name_Name, 'Description') xml_obj.set_element_text(node_item6, '') # 设置item节点与属性与内容 try: if xml_obj is not None: parser.metadata.set_metadata_bus( self.Success, '元数据文件成功构建! ', self.MetaDataFormat_XML, xml_obj.to_xml() ) return CResult.merge_result( self.Success, '元数据文件成功构建! ' ) else: raise except Exception as error: parser.metadata.set_metadata_bus( self.Exception, '构建元数据文件失败, 无法处理! 错误原因为{0}'.format(error.__str__()), self.MetaDataFormat_Text, '' ) return CResult.merge_result( self.Exception, '构建元数据文件失败, 无法处理! 错误原因为{0}'.format(error.__str__()) )
class CMetaData(CResource): def __init__(self): self.__quality__ = CQuality() self.__metadata_extract_result__ = self.Not_Support self.__metadata_extract_memo__ = '' self.__metadata_text__ = None self.__metadata_xml__ = CXml() self.__metadata_json__ = CJson() self.__metadata_type__ = self.MetaDataFormat_Text self.__metadata_bus_extract_result__ = self.Not_Support self.__metadata_bus_extract_memo__ = '' self.__metadata_bus_text__ = None self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__ = CJson() self.__metadata_bus_type__ = self.MetaDataFormat_Text self.__thumb_img_file_name__ = '' self.__browse_img_file_name__ = '' self.__metadata_view_extract_result__ = self.Not_Support self.__metadata_view_extract_memo__ = '' self.__time_information__ = CJson() self.__metadata_time_extract_result__ = self.Not_Support self.__metadata_time_extract_memo__ = '' self.__metadata_spatial_extract_result__ = self.Not_Support self.__metadata_spatial_extract_memo__ = '' self.__metadata_spatial__ = CMDSpatial() def metadata_time(self): if self.__metadata_time_extract_result__ == self.DB_True: return self.__metadata_time_extract_result__, self.__metadata_time_extract_memo__, self.__time_information__.to_json( ) else: return self.__metadata_time_extract_result__, self.__metadata_time_extract_memo__, '' def metadata_view(self): if self.__metadata_view_extract_result__ == self.DB_True: return self.__metadata_view_extract_result__, self.__metadata_view_extract_memo__, self.__thumb_img_file_name__, self.__browse_img_file_name__ else: return self.__metadata_view_extract_result__, self.__metadata_view_extract_memo__, '', '' def metadata_spatial(self): if self.__metadata_spatial_extract_result__ == self.DB_True: return self.__metadata_spatial_extract_result__, self.__metadata_spatial_extract_memo__, self.__metadata_spatial__ else: return self.__metadata_spatial_extract_result__, self.__metadata_spatial_extract_memo__, self.__metadata_spatial__ @property def quality(self): return self.__quality__ @property def thumb_img_file_name(self): return self.__thumb_img_file_name__ @thumb_img_file_name.setter def thumb_img_file_name(self, value): self.__thumb_img_file_name__ = value @property def browse_img_file_name(self): return self.__browse_img_file_name__ @browse_img_file_name.setter def browse_img_file_name(self, value): self.__browse_img_file_name__ = value @property def time_information(self) -> CJson: return self.__time_information__ @property def metadata_extract_result(self): return self.__metadata_extract_result__ @property def metadata_bus_extract_result(self): return self.__metadata_bus_extract_result__ @property def metadata_view_extract_result(self): return self.__metadata_view_extract_result__ @property def metadata_time_extract_result(self): return self.__metadata_time_extract_result__ @property def metadata_spatial_extract_result(self): return self.__metadata_spatial_extract_result__ def metadata(self): if self.__metadata_extract_result__ != self.DB_True: return self.__metadata_extract_result__, self.__metadata_extract_memo__, self.__metadata_type__, None elif self.__metadata_type__ == self.MetaDataFormat_Json: return self.__metadata_extract_result__, self.__metadata_extract_memo__, self.__metadata_type__, self.__metadata_json__.to_json( ) elif self.__metadata_type__ == self.MetaDataFormat_XML: return self.__metadata_extract_result__, self.__metadata_extract_memo__, self.__metadata_type__, self.__metadata_xml__.to_xml( ) else: return self.__metadata_extract_result__, self.__metadata_extract_memo__, self.__metadata_type__, self.__metadata_text__ @property def metadata_type(self): return self.__metadata_type__ @property def metadata_bus_type(self): return self.__metadata_bus_type__ def metadata_xml(self) -> CXml: return self.__metadata_xml__ def metadata_json(self) -> CJson: return self.__metadata_json__ def metadata_bus_xml(self) -> CXml: return self.__metadata_bus_xml__ def metadata_bus_json(self) -> CJson: return self.__metadata_bus_json__ def metadata_spatial_obj(self) -> CMDSpatial: return self.__metadata_spatial__ def set_metadata_spatial(self, result: int, memo: str, spatial_metadata_type=None, spatial_metadata=None): self.__metadata_spatial_extract_result__ = result self.__metadata_spatial_extract_memo__ = memo if spatial_metadata_type is None: return if spatial_metadata_type == CResource.Spatial_MetaData_Type_Native_Center: self.__metadata_spatial__.native_center = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Native_BBox: self.__metadata_spatial__.native_box = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Native_Geom: self.__metadata_spatial__.native_geom = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Wgs84_Center: self.__metadata_spatial__.wgs84_center = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Wgs84_BBox: self.__metadata_spatial__.wgs84_bbox = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Wgs84_Geom: self.__metadata_spatial__.wgs84_geom = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Wkt: self.__metadata_spatial__.prj_wkt = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Proj4: self.__metadata_spatial__.prj_proj4 = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Project: self.__metadata_spatial__.prj_project = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Coordinate: self.__metadata_spatial__.prj_coordinate = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Degree: self.__metadata_spatial__.prj_degree = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Zone: self.__metadata_spatial__.prj_zone = spatial_metadata elif spatial_metadata_type == CResource.Spatial_MetaData_Type_Prj_Source: self.__metadata_spatial__.prj_source = spatial_metadata else: pass def set_metadata_view(self, result: int, memo: str, view_metadata_type=None, view_metadata=None): self.__metadata_view_extract_result__ = result self.__metadata_view_extract_memo__ = memo if view_metadata_type is None: self.__browse_img_file_name__ = None self.__thumb_img_file_name__ = None return if view_metadata_type == CResource.View_MetaData_Type_Browse: self.__browse_img_file_name__ = view_metadata elif view_metadata_type == CResource.View_MetaData_Type_Thumb: self.__thumb_img_file_name__ = view_metadata else: pass def set_metadata_time(self, result: int, memo: str, time_attr_name=None, time_attr_value=None): self.__metadata_time_extract_result__ = result self.__metadata_time_extract_memo__ = memo if time_attr_name is not None: self.__time_information__.set_value_of_name( CUtils.any_2_str(time_attr_name), time_attr_value) def set_metadata(self, metadata_extract_result: int, metadata_extract_memo: str, metadata_type: int, metadata_text): self.__metadata_extract_result__ = metadata_extract_result self.__metadata_extract_memo__ = metadata_extract_memo self.__metadata_type__ = metadata_type if self.__metadata_type__ == self.MetaDataFormat_Json: self.__metadata_text__ = '' self.__metadata_xml__ = CXml() self.__metadata_json__.load_json_text(metadata_text) elif self.__metadata_type__ == self.MetaDataFormat_XML: self.__metadata_text__ = '' self.__metadata_xml__.load_xml(metadata_text) self.__metadata_json__ = CJson() else: self.__metadata_text__ = metadata_text self.__metadata_xml__ = CXml() self.__metadata_json__ = CJson() def set_metadata_file(self, metadata_extract_result: int, metadata_extract_memo: str, metadata_type: int, file_name): self.__metadata_extract_result__ = metadata_extract_result self.__metadata_extract_memo__ = metadata_extract_memo self.__metadata_type__ = metadata_type if self.__metadata_type__ == self.MetaDataFormat_Json: self.__metadata_text__ = '' self.__metadata_xml__ = CXml() self.__metadata_json__.load_file(file_name) elif self.__metadata_type__ == self.MetaDataFormat_XML: self.__metadata_text__ = '' self.__metadata_xml__.load_file(file_name) self.__metadata_json__ = CJson() else: self.__metadata_text__ = CFile.file_2_str(file_name) self.__metadata_xml__ = CXml() self.__metadata_json__ = CJson() def metadata_bus(self): if self.__metadata_bus_extract_result__ != self.DB_True: return self.__metadata_bus_extract_result__, self.__metadata_bus_extract_memo__, self.__metadata_bus_type__, None elif self.__metadata_bus_type__ == self.MetaDataFormat_Json: return self.__metadata_bus_extract_result__, self.__metadata_bus_extract_memo__, self.__metadata_bus_type__, self.__metadata_bus_json__.to_json( ) elif self.__metadata_bus_type__ == self.MetaDataFormat_XML: return self.__metadata_bus_extract_result__, self.__metadata_bus_extract_memo__, self.__metadata_bus_type__, self.__metadata_bus_xml__.to_xml( ) else: return self.__metadata_bus_extract_result__, self.__metadata_bus_extract_memo__, self.__metadata_bus_type__, self.__metadata_bus_text__ def set_metadata_bus(self, metadata_bus_extract_result: int, metadata_bus_extract_memo: str, metadata_bus_type: int, metadata_bus_text): self.__metadata_bus_extract_result__ = metadata_bus_extract_result self.__metadata_bus_extract_memo__ = metadata_bus_extract_memo self.__metadata_bus_type__ = metadata_bus_type if self.__metadata_bus_type__ == self.MetaDataFormat_Json: self.__metadata_bus_text__ = '' self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__.load_json_text(metadata_bus_text) elif self.__metadata_bus_type__ == self.MetaDataFormat_XML: self.__metadata_bus_text__ = '' self.__metadata_bus_xml__.load_xml(metadata_bus_text) self.__metadata_bus_json__ = CJson() else: self.__metadata_bus_text__ = metadata_bus_text self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__ = CJson() def set_metadata_bus_file(self, metadata_bus_extract_result: int, metadata_bus_extract_memo: str, metadata_type: int, file_name): self.__metadata_bus_extract_result__ = metadata_bus_extract_result self.__metadata_bus_extract_memo__ = metadata_bus_extract_memo self.__metadata_bus_type__ = metadata_type if self.__metadata_bus_type__ == self.MetaDataFormat_Json: self.__metadata_bus_text__ = '' self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__.load_file(file_name) elif self.__metadata_bus_type__ == self.MetaDataFormat_XML: self.__metadata_bus_text__ = '' self.__metadata_bus_xml__.load_file(file_name) self.__metadata_bus_json__ = CJson() else: self.__metadata_bus_text__ = CFile.file_2_str(file_name) self.__metadata_bus_xml__ = CXml() self.__metadata_bus_json__ = CJson()
def init_metadata_bus(self, parser: CMetaDataParser) -> str: """ 通过相应信息转换xml """ xml_obj = CXml() # 建立xml对象 node_root = xml_obj.new_xml('root') node_item1 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item1, self.Name_Name, 'ProductName') xml_obj.set_element_text(node_item1, parser.file_info.file_main_name) # 设置item节点与属性与内容 pathdata_list = re.findall( r'(?i)^.+' r'[-_/]?([1-9]\d{3}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1]))[-_/]?' r'.+' r'[\\\\/]影像', parser.file_info.file_path ) if len(pathdata_list) > 0: pathdata = CUtils.any_2_str(pathdata_list[0]) else: pathdata = '' node_item2 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item2, self.Name_Name, 'DataDate') xml_obj.set_element_text(node_item2, pathdata) # 设置item节点与属性与内容 # 影像元数据dsometadatajson.pixelsize.width节点 # width < 0.01时,resolution = width * 110000, # width > 0.01时,resolution = width pixelsize_value = parser.metadata.metadata_json().xpath_one('pixelsize.width', None) if pixelsize_value is not None: pixelsize_num = CUtils.to_decimal(pixelsize_value, None) if pixelsize_num is not None: if CUtils.to_decimal(pixelsize_value, 0) < 0.01: pixelsize_value = pixelsize_num * 110000 else: pixelsize_value = '' else: pixelsize_value = '' pixelsize_value = CUtils.any_2_str(pixelsize_value) if len(pixelsize_value) > 10: pixelsize_value = pixelsize_value[:10] node_item3 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item3, self.Name_Name, 'Resolution') xml_obj.set_element_text(node_item3, pixelsize_value) # 设置item节点与属性与内容 SatelliteID_list = re.findall( r'(?i)^.+' r'[-_/]?[1-9]\d{3}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])[-_/]?' r'(.+)' r'[\\\\/]影像', parser.file_info.file_path ) if len(SatelliteID_list) > 0: SatelliteID = CUtils.any_2_str(SatelliteID_list[0][2]) else: SatelliteID = '' node_item4 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item4, self.Name_Name, 'SatelliteID') xml_obj.set_element_text(node_item4, SatelliteID) # 设置item节点与属性与内容 GeographicName_list = re.findall( r'(?i)^(.+)' r'[-_/]?[1-9]\d{3}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])[-_/]?' r'.+' r'[\\\\/]影像', parser.file_info.file_path ) if len(GeographicName_list) > 0: GeographicName = CUtils.any_2_str(GeographicName_list[0]) if CUtils.text_match_re(GeographicName, '[-_/]$'): GeographicName = GeographicName[:-1] GeographicName = CFile.file_main_name(GeographicName) else: GeographicName = '' node_item5 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item5, self.Name_Name, 'GeographicName') xml_obj.set_element_text(node_item5, GeographicName) # 设置item节点与属性与内容 node_item6 = xml_obj.create_element(node_root, 'item') xml_obj.set_attr(node_item6, self.Name_Name, 'Description') xml_obj.set_element_text(node_item6, '') # 设置item节点与属性与内容 try: if xml_obj is not None: parser.metadata.set_metadata_bus( self.Success, '元数据文件成功构建! ', self.MetaDataFormat_XML, xml_obj.to_xml() ) return CResult.merge_result( self.Success, '元数据文件成功构建! ' ) else: raise except Exception as error: parser.metadata.set_metadata_bus( self.Exception, '构建元数据文件失败, 无法处理! 错误原因为{0}'.format(error.__str__()), self.MetaDataFormat_Text, '' ) return CResult.merge_result( self.Exception, '构建元数据文件失败, 无法处理! 错误原因为{0}'.format(error.__str__()) )
class CQuality(CResource): __xml_obj: CXml # 根节点 __xml_root_node = None # 整体质量节点 __node_total = None # 数据质量节点 __node_data = None # 数据的总体质量节点 __node_data_items = None # 数据的每一个记录的质量节点, 用于矢量数据检验 __node_data_records = None # 元数据质量节点 __node_metadata = None # 业务元数据质量节点 __node_metadata_bus = None # 数据本身的元数据质量节点 __node_metadata_data = None __XPath_Root = '/root' __XPath_Total = '{0}/total'.format(__XPath_Root) __XPath_MetaData = '{0}/metadata'.format(__XPath_Root) __XPath_MetaData_Data = '{0}/data'.format(__XPath_MetaData) __XPath_MetaData_Bus = '{0}/business'.format(__XPath_MetaData) __XPath_Data = '{0}/data'.format(__XPath_Root) __XPath_Data_Items = '{0}/items'.format(__XPath_Data) def __init__(self): self.__xml_obj = CXml() self.__xml_root_node = self.__xml_obj.new_xml(self.Name_Root) self.__node_total = CXml.create_element(self.__xml_root_node, self.Name_Total) self.__node_data = CXml.create_element(self.__xml_root_node, self.Name_Data) self.__node_data_items = CXml.create_element(self.__node_data, self.Name_Items) self.__node_data_records = CXml.create_element(self.__node_data, self.Name_Records) self.__node_metadata = CXml.create_element(self.__xml_root_node, self.Name_MetaData) self.__node_metadata_bus = CXml.create_element(self.__node_metadata, self.Name_Business) self.__node_metadata_data = CXml.create_element( self.__node_metadata, self.Name_Data) def __append_quality_info(self, xml_node, audit_result: dict): quality_id = CUtils.dict_value_by_name(audit_result, self.Name_ID, '') quality_title = CUtils.dict_value_by_name(audit_result, self.Name_Title, '') quality_group = CUtils.dict_value_by_name(audit_result, self.Name_Group, self.QA_Group_Data_Integrity) quality_result = CUtils.dict_value_by_name(audit_result, self.Name_Result, self.QA_Result_Pass) quality_memo = CUtils.dict_value_by_name(audit_result, self.Name_Message, '') temp_node = CXml.node_xpath_one( xml_node, './{0}[@id="{1}"]'.format(self.Name_Item, quality_id)) if temp_node is not None: CXml.remove(temp_node) temp_node = CXml.create_element(xml_node, self.Name_Item) CXml.set_attr(temp_node, self.Name_ID, quality_id) CXml.set_attr(temp_node, self.Name_Group, quality_group) CXml.set_attr(temp_node, self.Name_Title, quality_title) CXml.set_attr(temp_node, self.Name_Result, quality_result) CXml.set_element_text(temp_node, quality_memo) def append_total_quality(self, audit_result: dict): """ 设置总体的质量信息 . 质量标识: 重复的质量标识, 仅仅保留一个 . 质量标题: 中文简述 . 质量类型: 信息:提示;警告:警示;错误:错误, 不能继续 . 质量描述: 质量的详细描述 :param audit_result: :return: """ self.__append_quality_info(self.__node_total, audit_result) def append_data_quality(self, audit_result: dict): """ 设置数据的总体质量 :param audit_result: :return: """ self.__append_quality_info(self.__node_data_items, audit_result) def append_data_records_quality(self, record_index, audit_result: dict): """ 设置数据的每一个记录的质量信息 :param record_index: :param audit_result: :return: """ temp_node = CXml.node_xpath_one( self.__node_data_records, './{0}[@index="{1}"]'.format(self.Name_Record, record_index)) if temp_node is None: temp_node = CXml.create_element(self.__node_data_records, self.Name_Record) self.__append_quality_info(temp_node, audit_result) def append_metadata_data_quality(self, audit_result: dict): """ 设置实体的元数据质量检验结果 :param audit_result: :return: """ self.__append_quality_info(self.__node_metadata_data, audit_result) def append_metadata_bus_quality(self, audit_result: dict): """ 设置业务的元数据质量检验结果 :param audit_result: :return: """ self.__append_quality_info(self.__node_metadata_bus, audit_result) def save_as(self, file_name_with_path): """ 将质检结果保存为文件 :param file_name_with_path: :return: """ self.__xml_obj.save_file(file_name_with_path) def to_xml(self) -> str: """ 将质检结果导出为xml文本 :return: """ return self.__xml_obj.to_xml() def summary(self) -> str: json_obj = CJson() json_obj.set_value_of_name( self.Name_Total, self.__quality_result_of_level(self.__XPath_Total)) metadata_qa_s = { self.Name_Data: self.__quality_result_of_level(self.__XPath_MetaData_Data), self.Name_Business: self.__quality_result_of_level(self.__XPath_MetaData_Bus) } json_obj.set_value_of_name(self.Name_MetaData, metadata_qa_s) json_obj.set_value_of_name( self.Name_Data, { self.Name_Items: self.__quality_result_of_level(self.__XPath_Data_Items) }) return json_obj.to_json() def __quality_result_of_level(self, xpath: str): if self.__xml_obj.xpath_one('{0}/*[@{1}="{2}"]'.format( xpath, self.Name_Result, self.QA_Result_Error)) is not None: return self.QA_Result_Error elif self.__xml_obj.xpath_one('{0}/*[@{1}="{2}"]'.format( xpath, self.Name_Result, self.QA_Result_Warn)) is not None: return self.QA_Result_Warn else: return self.QA_Result_Pass