def test_get_tree(self): """ 获取节点所在的树对象 :return: """ xml_content = '''<root name="hello world"><element>hello</element></root>''' xml = CXml() xml.load_xml(xml_content) element = xml.root_element() tree = CXml.get_element_tree(element) assert CXml.get_element_xml(tree) == xml_content
def test_save_file(self): """ 通过给定的xml文件名, 对xml对象进行初始化 """ xml_content = ''' <root name="hello world">hello</root> ''' xml = CXml() xml.load_xml(xml_content) xml.save_file(self.test_filename, encoding=CXml.Encoding_UTF8) assert True
def test_get_element_root(self): """ 获取节点的根节点 :return: """ xml_content = '''<root name="hello world"><element>hello</element></root>''' xml = CXml() xml.load_xml(xml_content) element = xml.root_element() rt = CXml.get_element_root(element) assert CXml.get_element_xml(rt) == xml_content
def test_get_element_name(self): """ 获取节点的名称 :return: """ xml_content = '''<root name="hello world"><element>hello</element></root>''' xml = CXml() xml.load_xml(xml_content) element = xml.xpath('/root/element')[0] name = CXml.get_element_name(element) assert name == 'element'
def test_set_element_text(self): """ 设置一个节点的文本 :return: """ xml_content = '''<root name="hello world"></root>''' xml = CXml() xml.load_xml(xml_content) element = xml.xpath('/root')[0] CXml.set_element_text(element, 'hello') assert CXml.get_element_xml(element) == '<root name="hello world"><![CDATA[hello]]></root>'
def test_set_attr(self): """ 设置一个节点的属性 :return: """ xml_content = '''<root name="hello world"></root>''' xml = CXml() xml.load_xml(xml_content) element = xml.xpath_one('/root') CXml.set_attr(element, 'name', 'championing') assert CXml.get_element_xml(element) == '<root name="championing"/>'
def test_get_attr(self): """ 获取一个属性的值, 如果属性不存在, 则返回默认值 :return: """ xml_content = '''<root name="hello world"><element hello="中国"></element><element hello="美国"></element></root>''' xml = CXml() xml.load_xml(xml_content) element = xml.xpath('/root/element')[1] value = CXml.get_attr(element, 'Hello', "null") assert value == '美国'
def test_get_element_text(self): """ 获取一个节点的文本 :return: """ xml_content = '''<root name="hello world"><element>world</element></root>''' xml = CXml() xml.load_xml(xml_content) element = xml.xpath('/root/element')[0] text = CXml.get_element_text(element) assert text == 'world'
def test_append(self): """ 将一个子节点加入到指定节点下 :return: """ xml_content = '''<root name="hello world"></root>''' xml = CXml() xml.load_xml(xml_content) child_element = etree.Element('train', name='wing') element = xml.root_element() CXml.append(element, child_element) assert CXml.get_element_xml(element) == '<root name="hello world"><train name="wing"/></root>'
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 test_creat_element(self): """ 在一个节点下创建一个新节点 :return: """ xml_content = ''' <root name="hello world"><element name="hello"></element></root> ''' xml = CXml() xml.load_xml(xml_content) element = xml.root_element() CXml.create_element(element, "element1") assert CXml.get_element_xml(element) == '<root name="hello world"><element name="hello"/><element1/></root>'
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset # 业务元数据 dsometadataxml_bus = object_table_data.value_by_name( 0, 'dsometadataxml_bus', '') xml = CXml() xml.load_xml(dsometadataxml_bus) # 下列字段名均待修改 self.add_value_to_sync_dict_list(sync_dict, 'aprmwid', object_table_id) self.add_value_to_sync_dict_list( sync_dict, 'mosaiclinefilename', xml.get_element_text_by_xpath_one("//item[@name='ProductName']")) self.add_value_to_sync_dict_list( sync_dict, 'sensors', xml.get_element_text_by_xpath_one("//item[@name='SatelliteID']")) self.add_value_to_sync_dict_list( sync_dict, 'dsometadatajson', object_table_data.value_by_name(0, 'dsometadataxml_bus', '')) self.add_value_to_sync_dict_list( sync_dict, 'resolution', xml.get_element_text_by_xpath_one("//item[@name='Resolution']")) # self.add_value_to_sync_dict_list(sync_dict, 'regionname', xml.get_element_text_by_xpath_one( # "//item[@name='GeographicName']")) dso_prj_project = object_table_data.value_by_name( 0, 'dso_prj_project', '') if CUtils.equal_ignore_case(dso_prj_project, 'tj2000'): dso_prj_project = '2000天津城市坐标系' if CUtils.equal_ignore_case(dso_prj_project, 'tj1990'): dso_prj_project = '1990天津任意直角坐标系' if CUtils.equal_ignore_case(dso_prj_project, 'cgcs2000'): dso_prj_project = '2000国家标准坐标系' else: dataoptions = '其他国家标准坐标系' self.add_value_to_sync_dict_list(sync_dict, 'dataoptions', dso_prj_project) # 备注 self.add_value_to_sync_dict_list( sync_dict, 'remark', xml.get_element_text_by_xpath_one("//item[@name='Description']")) return sync_dict
def mdb_to_xml(self, file_metadata_name_with_path: str): """ TODO 王学谦 mdb文件转xml,在函数外提前定义xml对象并获取父节点传入,函数会将通过父节点构造xml对象 :param file_metadata_name_with_path:查询的mdb文件全名,带路径 :return xml_obj:将文件内容存储好的项目对象 """ conn = None # 预定义连接与游标,方便释放 cur = None try: conn = self.get_mdb_connect(file_metadata_name_with_path) cur = conn.cursor() # 游标 xml_obj = CXml() # 建立xml对象 node_root = xml_obj.new_xml('root') xml_obj.set_attr(node_root, self.Name_Type, self.transformer_type) # 设置root节点与属性 table_name_list = ['mbii', 'mpid', 'mppi', 'mqc1', 'mqc2', 'mdac'] for table_name in table_name_list: try: sql = "SELECT * FROM " + table_name cur.execute(sql) table_data = cur.fetchall() # total_rows = len(alldata) # 行 # total_cols = len(alldata[0]) # 列 node_property = xml_obj.create_element(node_root, 'property') xml_obj.set_attr(node_property, 'tablename', table_name) # 设置property节点与属性与内容 for field_index, row_obj in enumerate(cur.description): row_name = row_obj[0] # 字段名称 row_type = row_obj[1] # 字段类型 if row_type is bytearray: # 跳过长二进制数组 continue node_item = xml_obj.create_element(node_property, 'item') xml_obj.set_attr(node_item, self.Name_Name, CUtils.any_2_str(row_name).lower()) xml_obj.set_element_text(node_item, table_data[0][field_index]) # 设置item节点与属性与内容 except: continue except Exception as error: raise Exception(error.__str__()) finally: if cur is not None: cur.close() if conn is not None: conn.close() return xml_obj
def access_check_dict(self) -> dict: # 预留的方法,sync写完后再调 object_name = self._obj_name dsometadataxml_bus = self._dataset.value_by_name( 0, 'dsometadataxml_bus', '') xml = CXml() xml.load_xml(dsometadataxml_bus) # 初始化xml dsometadataxml_bus_type = '{0}'.format( xml.xpath_one("/root/@type")) # 查询业务元数据类别 if object_name is not None: if dsometadataxml_bus_type is not None: if CUtils.equal_ignore_case(dsometadataxml_bus_type, 'mdb'): return self.access_check_dict_mdb() elif CUtils.equal_ignore_case(dsometadataxml_bus_type, 'mat'): return self.access_mdb_check_dict_mat() elif CUtils.equal_ignore_case(dsometadataxml_bus_type, 'xls') \ or CUtils.equal_ignore_case(dsometadataxml_bus_type, 'xlsx'): return self.access_mdb_check_dict_xls() raise Exception("数据{0}业务元数据类型为'{1}'出现错误,没有可识别的类型".format( object_name, dsometadataxml_bus_type))
def txt_to_xml(self, file_metadata_name_with_path: str): """ 完成 王学谦 txt文件转xml,在函数外提前定义xml对象并获取父节点传入,函数会将通过父节点构造xml对象 by王学谦 :param file_metadata_name_with_path:查询的mat文件全名,带路径 :return xml_obj:将文件内容存储好的项目对象 """ text_list = CFile.file_2_list(file_metadata_name_with_path) # 获取mat文件作为列表 if (text_list is None) or len(text_list) == 0: raise Exception('元数据文件无法读取,请检查') # 如果获取的文件内容为空,则抛出异常 xml_obj = CXml() # 建立xml对象 node_root = xml_obj.new_xml('root') xml_obj.set_attr(node_root, self.Name_Type, self.Transformer_TXT) # 设置root节点与属性 # 设置操作的节点 current_node = node_root for row_text in text_list: if CUtils.equal_ignore_case('row_text', 'END'): break # 分割字符 row_list = re.split(r'=', row_text.strip()) if len(row_list) >= 2: # 为GROUP建立新节点 if CUtils.equal_ignore_case(row_list[0], 'GROUP'): node_item = xml_obj.create_element(current_node, 'item') # 值设为属性 item_value = CUtils.any_2_str(row_list[1].strip()) if item_value.startswith('"') and item_value.endswith('"'): item_value = item_value[1:-1] xml_obj.set_attr(node_item, self.Name_Name, item_value) current_node = node_item elif CUtils.equal_ignore_case(row_list[0], 'END_GROUP'): current_node = xml_obj.node_xpath_one(current_node, '..') else: node_item = xml_obj.create_element(current_node, 'item') xml_obj.set_attr(node_item, self.Name_Name, row_list[0].strip()) item_value = CUtils.any_2_str(row_list[1].strip()) if item_value.startswith('"') and item_value.endswith('"'): item_value = item_value[1:-1] xml_obj.set_element_text(node_item, item_value) return xml_obj
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 get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict_list = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset dsometadataxml = object_table_data.value_by_name( 0, 'dsometadataxml_bus', '') dsometadataxml_xml = CXml() dsometadataxml_xml.load_xml(dsometadataxml) # 加载查询出来的xml self.add_value_to_sync_dict_list(sync_dict_list, 'aprvdid1', object_table_id) self.add_value_to_sync_dict_list( sync_dict_list, 'dsnamed', dsometadataxml_xml.get_element_text_by_xpath_one( '/root/DSName')) # 配置字段值 if insert_or_updata: now_time = CUtils.any_2_str( datetime.datetime.now().strftime('%F %T')) self.add_value_to_sync_dict_list(sync_dict_list, 'adddate', now_time) self.add_value_to_sync_dict_list( sync_dict_list, 'dsdate', CUtils.to_day_format( dsometadataxml_xml.get_element_text_by_xpath_one('/root/Date'), '')) regioncode = dsometadataxml_xml.get_element_text_by_xpath_one( '/root/RegionCode') self.add_value_to_sync_dict_list( # regioncode:行政区码 sync_dict_list, 'dsregionno', regioncode) self.add_value_to_sync_dict_list(sync_dict_list, 'busitype', 'shp') self.add_value_to_sync_dict_list( # regionname:行政区 sync_dict_list, 'dsregionname', dsometadataxml_xml.get_element_text_by_xpath_one( '/root/RegionName')) self.add_value_to_sync_dict_list(sync_dict_list, 'dstype', '1') return sync_dict_list
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict_list = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset self.add_value_to_sync_dict_list( sync_dict_list, 'aprtwid', object_table_id) self.add_value_to_sync_dict_list( sync_dict_list, 'datatype', object_table_data.value_by_name(0, 'dsodatatype', '')) dsometadataxml = object_table_data.value_by_name(0, 'dsometadataxml_bus', '') dsometadataxml_xml = CXml() dsometadataxml_xml.load_xml(dsometadataxml) # 加载查询出来的xml self.add_value_to_sync_dict_list(sync_dict_list, 'dsometadatajson', dsometadataxml) self.add_value_to_sync_dict_list( sync_dict_list, 'sensors', list([dsometadataxml_xml.get_element_text_by_xpath_one('/root/MajorSource')]), self.DataValueType_Array) return sync_dict_list
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset # 业务元数据 dsometadataxml_bus = object_table_data.value_by_name( 0, 'dsometadataxml_bus', '') xml = CXml() xml.load_xml(dsometadataxml_bus) # 下列字段名均待修改 self.add_value_to_sync_dict_list(sync_dict, 'aprmwid', object_table_id) self.add_value_to_sync_dict_list( sync_dict, 'mosaiclinefilename', xml.get_element_text_by_xpath_one("//item[@name='ProductName']")) self.add_value_to_sync_dict_list( sync_dict, 'sensors', xml.get_element_text_by_xpath_one("//item[@name='SatelliteID']")) self.add_value_to_sync_dict_list( sync_dict, 'dsometadatajson', object_table_data.value_by_name(0, 'dsometadataxml_bus', '')) self.add_value_to_sync_dict_list( sync_dict, 'resolution', xml.get_element_text_by_xpath_one("//item[@name='Resolution']")) self.add_value_to_sync_dict_list( sync_dict, 'imagesource', xml.get_element_text_by_xpath_one( "//item[@name='GeographicName']")) # 备注 self.add_value_to_sync_dict_list( sync_dict, 'remark', xml.get_element_text_by_xpath_one("//item[@name='Description']")) return sync_dict
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict_list = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset self.add_value_to_sync_dict_list(sync_dict_list, 'aprswid', object_table_id) dsometadataxml = object_table_data.value_by_name( 0, 'dsometadataxml_bus', '') dsometadataxml_xml = CXml() dsometadataxml_xml.load_xml(dsometadataxml) # 加载查询出来的xml self.add_value_to_sync_dict_list( sync_dict_list, 'domname', dsometadataxml_xml.get_element_text_by_xpath_one('/root/DSName')) self.add_value_to_sync_dict_list( sync_dict_list, 'scaletext', dsometadataxml_xml.get_element_text_by_xpath_one( '/root/ScaleDenominator')) self.add_value_to_sync_dict_list( sync_dict_list, 'scaleD', dsometadataxml_xml.get_element_text_by_xpath_one( '/root/ScaleDenominator')) self.add_value_to_sync_dict_list( sync_dict_list, 'datatype', object_table_data.value_by_name(0, 'dsodatatype', '')) self.add_value_to_sync_dict_list( sync_dict_list, 'publishDate', CUtils.to_day_format( dsometadataxml_xml.get_element_text_by_xpath_one('/root/Date'), '')) self.add_value_to_sync_dict_list(sync_dict_list, 'dsometadatajson', dsometadataxml) return sync_dict_list
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ object_name = self._obj_name dsometadataxml_bus = self._dataset.value_by_name( 0, 'dsometadataxml_bus', '') xml = CXml() xml.load_xml(dsometadataxml_bus) # 初始化xml dsometadataxml_bus_type = '{0}'.format( xml.xpath_one("/root/@type")) # 查询业务元数据类别 if object_name is not None: if dsometadataxml_bus_type is not None: if CUtils.equal_ignore_case(dsometadataxml_bus_type, 'mdb'): return self.get_sync_mdb_dict_list(insert_or_updata) elif CUtils.equal_ignore_case(dsometadataxml_bus_type, 'mat'): return self.get_sync_mat_dict_list(insert_or_updata) elif CUtils.equal_ignore_case(dsometadataxml_bus_type, 'xls') \ or CUtils.equal_ignore_case(dsometadataxml_bus_type, 'xlsx'): return self.get_sync_xls_dict_list(insert_or_updata) raise Exception("数据{0}业务元数据类型为'{1}'出现错误,没有可识别的类型".format( object_name, dsometadataxml_bus_type))
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset # 业务元数据 dsometadataxml_bus = object_table_data.value_by_name(0, 'dsometadataxml_bus', '') xml = CXml() xml.load_xml(dsometadataxml_bus) # 后处理流程介绍文档中的字段 self.add_value_to_sync_dict_list(sync_dict, 'aprgdid', object_table_id) self.add_value_to_sync_dict_list(sync_dict, 'aprgwid', object_table_data.value_by_name(0, 'dsoparentobjid', '')) self.add_value_to_sync_dict_list(sync_dict, 'datatype', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/DataFormat')) self.add_value_to_sync_dict_list(sync_dict, 'panfilename', object_table_data.value_by_name(0, 'dsoobjectname', '')) self.add_value_to_sync_dict_list(sync_dict, 'pansensorname', xml.get_element_text_by_xpath_one( '//PBandSensorType')) # numeric self.add_value_to_sync_dict_list(sync_dict, 'panresolution', xml.get_element_text_by_xpath_one( '//SateResolution')) self.add_value_to_sync_dict_list(sync_dict, 'pantraceno', xml.get_element_text_by_xpath_one( '//PBandOribitCode')) # self.add_value_to_sync_dict_list(sync_dict, 'panimagedate', xml.get_element_text_by_xpath_one('')) self.add_value_to_sync_dict_list(sync_dict, 'msfilename', object_table_data.value_by_name(0, 'dsoobjectname', '')) self.add_value_to_sync_dict_list(sync_dict, 'satename', xml.get_element_text_by_xpath_one('//SateName')) # int4 self.add_value_to_sync_dict_list(sync_dict, 'mssensorname', xml.get_element_text_by_xpath_one( '//MultiBandSensorType')) self.add_value_to_sync_dict_list(sync_dict, 'msresolution', xml.get_element_text_by_xpath_one( '//MultiBandResolution')) self.add_value_to_sync_dict_list(sync_dict, 'mstraceno', xml.get_element_text_by_xpath_one( '//MultiBandOrbitCode')) # self.add_value_to_sync_dict_list(sync_dict, 'msimagedate', xml.get_element_text_by_xpath_one('')) self.add_value_to_sync_dict_list(sync_dict, 'bandcount', xml.get_element_text_by_xpath_one( '//MultiBandNum')) self.add_value_to_sync_dict_list(sync_dict, 'bandname', xml.get_element_text_by_xpath_one( '//MultiBandName')) # self.add_value_to_sync_dict_list(sync_dict, 'bandide', xml.get_element_text_by_xpath_one('')) # int4 self.add_value_to_sync_dict_list(sync_dict, 'zoneno', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/MathFoundation/GaussKrugerZoneNo')) # self.add_value_to_sync_dict_list(sync_dict, 'sensor', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'sensorscode', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'cloudpercent', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'istile', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'tileindex', xml.get_element_text_by_xpath_one('')) self.add_value_to_sync_dict_list(sync_dict, 'metafilename', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/MetaDataFileName')) self.add_value_to_sync_dict_list(sync_dict, 'dsometadatajson', object_table_data.value_by_name(0, 'dsometadataxml_bus', '')) # 数据量 self.add_value_to_sync_dict_list(sync_dict, 'datacount', 1) # 密级 self.add_value_to_sync_dict_list(sync_dict, 'secrecylevel', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/ConfidentialLevel')) # 行政区码 # self.add_value_to_sync_dict_list(sync_dict, 'regioncode',xml.get_element_text_by_xpath_one() # 行政区 # self.add_value_to_sync_dict_list(sync_dict, 'regionname',xml.get_element_text_by_xpath_one() # 产品时间 # self.add_value_to_sync_dict_list(sync_dict, 'producetime', xml.get_element_text_by_xpath_one('')) # 分辨率 self.add_value_to_sync_dict_list(sync_dict, 'resolution', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/GroundResolution')) # 色彩模式 self.add_value_to_sync_dict_list(sync_dict, 'colormodel', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/ImgColorModel')) # 像素位数 self.add_value_to_sync_dict_list(sync_dict, 'piexldepth', xml.get_element_text_by_xpath_one('/Metadatafile/BasicDataContent/PixelBits')) # 比例尺分母 # self.add_value_to_sync_dict_list(sync_dict, 'scale', xml.get_element_text_by_xpath_one('')) # 主要星源 self.add_value_to_sync_dict_list(sync_dict, 'mainrssource', xml.get_element_text_by_xpath_one('//SateName')) # 备注 # self.add_value_to_sync_dict_list(sync_dict, 'remark', xml.get_element_text_by_xpath_one('')) return sync_dict
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset # 业务元数据 dsometadataxml_bus = object_table_data.value_by_name( 0, 'dsometadataxml_bus', '') xml = CXml() xml.load_xml(dsometadataxml_bus) # 后处理流程介文档中的字段 self.add_value_to_sync_dict_list(sync_dict, 'aprmwid', object_table_id) # sync_dict['datatype'] = "'{0}'".format() # sync_dict['projinfo'] = "'{0}'".format() # sync_dict['zonetype'] = "'{0}'".format() # sync_dict['centerline'] = "'{0}'".format() # int4 # sync_dict['zoneno'] = "'{0}'".format() # sync_dict['coordinateunit'] = "'{0}'".format() # sync_dict['demname'] = "'{0}'".format() # sync_dict['demstandard'] = "'{0}'".format() self.add_value_to_sync_dict_list( sync_dict, 'mosaiclinefilename', object_table_data.value_by_name(0, 'dsoobjectname', '')) # sync_dict['sensors'] = "'{0}'".format() # sync_dict['iscuted'] = "'{0}'".format() # numeric # sync_dict['productsize'] = "'{0}'".format() self.add_value_to_sync_dict_list( sync_dict, 'imagesource', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/ImageSource')) self.add_value_to_sync_dict_list( sync_dict, 'dsometadatajson', object_table_data.value_by_name(0, 'dsometadataxml_bus', '')) # 数据量 self.add_value_to_sync_dict_list(sync_dict, 'datacount', 1) # 密级 # sync_dict['secrecylevel'] = "''" # 行政区码 # sync_dict['regioncode'] = "''" # 行政区 # sync_dict['regionname'] = "''" # 产品时间 # sync_dict['producetime'] = "'{0}'".format( # xml.get_element_text_by_xpath_one('/Metadatafile/BasicDataContent/ProduceDate')) # 分辨率 self.add_value_to_sync_dict_list( sync_dict, 'resolution', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Resolution')) # 色彩模式 # self.add_value_to_sync_dict_list(sync_dict, 'colormodel',xml.get_element_text_by_xpath_one('')) # 像素位数 # self.add_value_to_sync_dict_list(sync_dict, 'piexldepth',xml.get_element_text_by_xpath_one('')) # 比例尺分母 # self.add_value_to_sync_dict_list(sync_dict, 'scale',xml.get_element_text_by_xpath_one('')) # 主要星源 # self.add_value_to_sync_dict_list(sync_dict, 'mainrssource', xml.get_element_text_by_xpath_one('')) # 备注 self.add_value_to_sync_dict_list( sync_dict, 'remark', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Description')) return sync_dict
def __find_module_obj(self, obj_id): sql_query = ''' SELECT dm2_storage_file.dsfid as query_file_id, dm2_storage_file.dsfdirectoryid as query_directory_id, dm2_storage_directory.dsddirlastmodifytime as query_directory_lastmodifytime, dm2_storage_directory.dsdid as query_dataset_directory_id, dm2_storage_object.* FROM dm2_storage_object LEFT JOIN dm2_storage_file on dm2_storage_file.dsf_object_id = dm2_storage_object.dsoid LEFT JOIN dm2_storage_directory on dm2_storage_directory.dsd_object_id = dm2_storage_object.dsoid WHERE dm2_storage_object.dsoid = '{0}' '''.format(obj_id) db_id = self._db_id # 数据库连接标识(查询的dm2的数管库) dataset = CFactory().give_me_db(db_id).one_row(sql_query) object_id = dataset.value_by_name(0, 'dsoid', '') object_name = dataset.value_by_name(0, 'dsoobjectname', '') quality_info = dataset.value_by_name(0, 'dso_quality', '') quality_info_xml = CXml() quality_info_xml.load_xml(quality_info) # 加载查询出来的xml db_id_distribution = self.DB_Server_ID_Distribution # 同步处理的目标数据库标识id # 构建数据对象object对应的识别插件,获取get_information里面的Plugins_Info_Module_Distribute_Engine信息 class_classified_obj = CObject.get_plugins_instance_by_object_id( db_id, object_id) if class_classified_obj is not None: plugins_info = class_classified_obj.get_information() obj_type_code = CUtils.dict_value_by_name( plugins_info, class_classified_obj.Plugins_Info_Type_Code, '') distribution_file_main_name = CUtils.dict_value_by_name( plugins_info, class_classified_obj.Plugins_Info_Module_Distribute_Engine, '') # 对应同步文件的类名称 # 判断同步插件文件是否存在 access_modules_root_dir = CSys.get_metadata_data_access_modules_root_dir( ) distribution_root_dir = CFile.join_file(access_modules_root_dir, self.Name_Distribution) distribution_file = CFile.join_file( distribution_root_dir, '{0}.py'.format(distribution_file_main_name)) if CFile.file_or_path_exist(distribution_file): # 构建同步对象 distribution_obj = CObject.create_module_distribution_instance( '{0}.{1}'.format( CSys.get_metadata_data_access_modules_root_name(), self.Name_Distribution), distribution_file_main_name, db_id_distribution, object_id, object_name, obj_type_code, quality_info_xml, dataset) distribution_obj.set_class_plugins(class_classified_obj) result = CResult.merge_result(self.Success, '数据的信息提取完成') return distribution_obj, result else: result = CResult.merge_result(self.Failure, '同步失败,因为本类数据的同步模块未建立') return None, result else: result = CResult.merge_result(self.Failure, '同步失败,因为本类数据的识别模块缺失') return None, result
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset # 业务元数据 dsometadataxml_bus = object_table_data.value_by_name( 0, 'dsometadataxml_bus', '') xml = CXml() xml.load_xml(dsometadataxml_bus) # 后处理流程介绍文档中的字段 self.add_value_to_sync_dict_list(sync_dict, 'aprtdid', object_table_id) self.add_value_to_sync_dict_list( sync_dict, 'aprtwid', object_table_data.value_by_name(0, 'dsoparentobjid', '')) self.add_value_to_sync_dict_list( sync_dict, 'datatype', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="sjgs"]')) self.add_value_to_sync_dict_list( sync_dict, 'demname', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="gcjz"]')) self.add_value_to_sync_dict_list( sync_dict, 'metafilename', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="ysjwjm"]')) # numeric self.add_value_to_sync_dict_list( sync_dict, 'isfull', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="mfqk"]')) self.add_value_to_sync_dict_list( sync_dict, 'ellipsoidtype', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="tqlx"]')) self.add_value_to_sync_dict_list( sync_dict, 'projinfo', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="dtty"]')) self.add_value_to_sync_dict_list( sync_dict, 'centerline', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="zyjx"]')) self.add_value_to_sync_dict_list( sync_dict, 'zonetype', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="fdfs"]')) # int4 self.add_value_to_sync_dict_list( sync_dict, 'zoneno', CUtils().to_integer( xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="gsklgtydh"]' ))) self.add_value_to_sync_dict_list( sync_dict, 'coordinateunit', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="zbdw"]')) self.add_value_to_sync_dict_list( sync_dict, 'dsometadatajson', object_table_data.value_by_name(0, 'dsometadataxml_bus', '')) self.add_value_to_sync_dict_list( sync_dict, 'demstandard', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="gcjz"]')) self.add_value_to_sync_dict_list( sync_dict, 'createrorganize', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="sjscdw"]')) # self.add_value_to_sync_dict_list(sync_dict, 'bandcount', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'bandname', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'cloudpercent', xml.get_element_text_by_xpath_one('')) # 数据量 self.add_value_to_sync_dict_list( sync_dict, 'datacount', CUtils.to_integer( xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="sjl"]'))) # 密级 self.add_value_to_sync_dict_list( sync_dict, 'secrecylevel', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="mj"]')) # 行政区码 self.add_value_to_sync_dict_list( sync_dict, 'regioncode', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="xzqdm"]')) # 行政区 self.add_value_to_sync_dict_list( sync_dict, 'regionname', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mbii"]/item[@name="xmc"]')) # 产品时间 # self.add_value_to_sync_dict_list(sync_dict, 'producetime', xml.get_element_text_by_xpath_one('')) # 分辨率 待提取 # self.add_value_to_sync_dict_list(sync_dict, 'resolution', xml.get_element_text_by_xpath_one(''), self.DB_True) # 色彩模式 # self.add_value_to_sync_dict_list(sync_dict, 'colormodel', xml.get_element_text_by_xpath_one('')) # 像素位数 # self.add_value_to_sync_dict_list(sync_dict, 'piexldepth', xml.get_element_text_by_xpath_one('')) # 比例尺分母 # self.add_value_to_sync_dict_list(sync_dict, 'scale', xml.get_element_text_by_xpath_one('')) # 主要星源 self.add_value_to_sync_dict_list( sync_dict, 'mainrssource', xml.get_element_text_by_xpath_one( '/root/property[@tablename="mpid"]/item[@name="sjy"]')) # 备注 # self.add_value_to_sync_dict_list(sync_dict, 'remark', xml.get_element_text_by_xpath_one('')) return sync_dict
def process_mission(self, dataset): dso_id = dataset.value_by_name(0, 'dsoid', '') dso_data_type = dataset.value_by_name(0, 'dsodatatype', '') dso_object_type = dataset.value_by_name(0, 'dsoobjecttype', '') dso_object_name = dataset.value_by_name(0, 'dsoobjectname', '') dso_object_da_content = CUtils.any_2_str(dataset.value_by_name(0, 'dso_da_result', '')) dso_object_quality = dataset.value_by_name(0, 'dso_quality', '') ds_retry_times = dataset.value_by_name(0, 'retry_times', 0) if ds_retry_times >= self.abnormal_job_retry_times(): ds_last_process_memo = CUtils.any_2_str(dataset.value_by_name(0, 'last_process_memo', None)) process_result = CResult.merge_result( self.Failure, '{0}, \n系统已经重试{1}次, 仍然未能解决, 请人工检查修正后重试!'.format( ds_last_process_memo, ds_retry_times ) ) self.update_status(dso_id, None, process_result, self.ProcStatus_Error) return process_result dso_quality = CXml() dso_quality.load_xml(dso_object_quality) dso_da_json = CJson() dso_da_json.load_json_text(dso_object_da_content) CLogger().debug( '开始处理对象: {0}.{1}.{2}.{3}对各个子系统的支撑能力'.format(dso_id, dso_data_type, dso_object_type, dso_object_name)) try: modules_root_dir = CSys.get_metadata_data_access_modules_root_dir() modules_file_list = CFile.file_or_subpath_of_path( modules_root_dir, '{0}_*.{1}'.format(self.Name_Module, self.FileExt_Py) ) for file_name_without_path in modules_file_list: file_main_name = CFile.file_main_name(file_name_without_path) # 判断模块的可访问是否已经被人工审批, 如果人工审批, 则这里不再计算和覆盖 module_access = dso_da_json.xpath_one( '{0}.{1}'.format(file_main_name, self.Name_Audit), self.Name_System ) if CUtils.equal_ignore_case(module_access, self.Name_User): continue try: module_obj = CObject.create_module_instance( CSys.get_metadata_data_access_modules_root_name(), file_main_name, self.get_mission_db_id() ) module_title = CUtils.dict_value_by_name(module_obj.information(), self.Name_Title, '') result = CUtils.any_2_str(module_obj.access(dso_id, dso_object_name, dso_data_type, dso_quality) ) if CResult.result_success(result): module_access = CResult.result_info(result, self.Name_Access, self.DataAccess_Forbid) else: CLogger().debug('模块[{0}]解析出现错误, 系统将忽略本模块, 继续处理下一个!'.format(file_main_name)) module_access = self.DataAccess_Unknown module_access_message = CResult.result_message(result) module_obj = {self.Name_Audit: self.Name_System, self.Name_Result: module_access, self.Name_Title: module_title, self.Name_Message: module_access_message} dso_da_json.set_value_of_name(file_main_name, module_obj) except Exception as error: CLogger().debug('模块[{0}]解析出现异常, 原因为[{1}], 请检查!'.format(file_main_name, error.__str__())) module_access = self.DataAccess_Unknown module_access_message = '模块[{0}]解析出现异常, 原因为[{1}], 请检查!'.format(file_main_name, error.__str__()) module_obj = {self.Name_Audit: self.Name_System, self.Name_Result: module_access, self.Name_Title: file_main_name, self.Name_Message: module_access_message} dso_da_json.set_value_of_name(file_main_name, module_obj) process_result = CResult.merge_result( self.Success, '对象[{0}.{1}]访问权限解析成功!'.format(dso_id, dso_object_name) ) self.update_status( dso_id, dso_da_json.to_json(), process_result ) return process_result except Exception as error: process_result = CResult.merge_result( self.Failure, '对象[{0}.{1}]访问权限解析出错, 原因为[{2}]!'.format(dso_id, dso_object_name, error.__str__()) ) self.update_status(dso_id, None, process_result) return process_result
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset # 业务元数据 dsometadataxml_bus = object_table_data.value_by_name( 0, 'dsometadataxml_bus', '') xml = CXml() xml.load_xml(dsometadataxml_bus) # 后处理流程介绍文档中的字段 self.add_value_to_sync_dict_list(sync_dict, 'aprgdid', object_table_id) # self.add_value_to_sync_dict_list(sync_dict, 'rowno', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'colno', xml.get_element_text_by_xpath_one('')) self.add_value_to_sync_dict_list( sync_dict, 'sfno', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/MapNo')) self.add_value_to_sync_dict_list( sync_dict, 'domname', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/ProductName')) # self.add_value_to_sync_dict_list(sync_dict, 'domscale',xml.get_element_text_by_xpath_one('') # self.add_value_to_sync_dict_list(sync_dict, 'imgyear', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'sensorscode', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'rescode', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'colorcode', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'tilecode', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'sepcode', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'extname', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'scalecode', xml.get_element_text_by_xpath_one('')) self.add_value_to_sync_dict_list( sync_dict, 'datatype', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/DataFormat')) # self.add_value_to_sync_dict_list(sync_dict, 'expandlength', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'panimagedate', xml.get_element_text_by_xpath_one('')) self.add_value_to_sync_dict_list( sync_dict, 'projinfo', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Mathfoundation/MapProjection')) self.add_value_to_sync_dict_list( sync_dict, 'zonetype', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Mathfoundation/ZoneDivisionMode' )) self.add_value_to_sync_dict_list( sync_dict, 'centerline', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Mathfoundation/CentralMederian' )) self.add_value_to_sync_dict_list( sync_dict, 'coordinateunit', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Mathfoundation/CoordinationUnit' )) self.add_value_to_sync_dict_list( sync_dict, 'createrorgnize', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Producer')) self.add_value_to_sync_dict_list( sync_dict, 'publishorgnize', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Publisher')) self.add_value_to_sync_dict_list( sync_dict, 'submitorganize', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Owner')) # int4 self.add_value_to_sync_dict_list( sync_dict, 'zoneno', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Mathfoundation/GaussKrugerZoneNo' )) self.add_value_to_sync_dict_list( sync_dict, 'demstandard', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Mathfoundation/HeightDatum')) self.add_value_to_sync_dict_list( sync_dict, 'demname', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Mathfoundation/HeightSystem')) # self.add_value_to_sync_dict_list(sync_dict, 'sensor', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'sensorscode', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'cloudpercent', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'istile', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'tileindex', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'isfull', xml.get_element_text_by_xpath_one('')) # self.add_value_to_sync_dict_list(sync_dict, 'imagesource', xml.get_element_text_by_xpath_one('')) self.add_value_to_sync_dict_list( sync_dict, 'metafilename', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/MetaDataFileName')) self.add_value_to_sync_dict_list( sync_dict, 'dsometadatajson', object_table_data.value_by_name(0, 'dsometadataxml_bus', '')) # 数据量 self.add_value_to_sync_dict_list(sync_dict, 'datacount', 1) # 密级 self.add_value_to_sync_dict_list( sync_dict, 'secrecylevel', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/ConfidentialLevel')) # 行政区码 # self.add_value_to_sync_dict_list(sync_dict, 'regioncode',xml.get_element_text_by_xpath_one() # 行政区 # self.add_value_to_sync_dict_list(sync_dict, 'regionname',xml.get_element_text_by_xpath_one() # 产品时间 # self.add_value_to_sync_dict_list(sync_dict, 'producetime', xml.get_element_text_by_xpath_one('')) # 分辨率 self.add_value_to_sync_dict_list( sync_dict, 'resolution', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/GroundResolution')) # 色彩模式 self.add_value_to_sync_dict_list( sync_dict, 'colormodel', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/ImgColorModel')) # 像素位数 self.add_value_to_sync_dict_list( sync_dict, 'piexldepth', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/PixelBits')) # 比例尺分母 # self.add_value_to_sync_dict_list(sync_dict, 'scale', xml.get_element_text_by_xpath_one('')) # 主要星源 self.add_value_to_sync_dict_list( sync_dict, 'mainrssource', xml.get_element_text_by_xpath_one('//SateName')) # 备注 # self.add_value_to_sync_dict_list(sync_dict, 'remark', xml.get_element_text_by_xpath_one('')) return sync_dict
def get_sync_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 中 self.DB_True为insert,DB_False为updata 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 """ sync_dict = self.get_sync_predefined_dict_list(insert_or_updata) object_table_id = self._obj_id object_table_data = self._dataset # 业务元数据 dsometadataxml_bus = object_table_data.value_by_name( 0, 'dsometadataxml_bus', '') xml = CXml() xml.load_xml(dsometadataxml_bus) # 后处理流程介绍文档中的字段 self.add_value_to_sync_dict_list(sync_dict, 'aprodid', object_table_id) self.add_value_to_sync_dict_list( sync_dict, 'aprowid', object_table_data.value_by_name(0, 'dsoparentobjid', '')) self.add_value_to_sync_dict_list( sync_dict, 'sataname', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/SatelliteID')) dsoobjectname = object_table_data.value_by_name(0, 'dsoobjectname', '') resolution = xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Resolution') if 'pan' in CUtils.text_to_lower(dsoobjectname): self.add_value_to_sync_dict_list(sync_dict, 'panfilename', dsoobjectname) self.add_value_to_sync_dict_list(sync_dict, 'panresolution', resolution) self.add_value_to_sync_dict_list( sync_dict, 'panimagedate', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/ReceiveTime')) self.add_value_to_sync_dict_list(sync_dict, 'fusefilename', dsoobjectname) else: self.add_value_to_sync_dict_list(sync_dict, 'msfilename', dsoobjectname) # sync_dict['mssensorname'] = "''" self.add_value_to_sync_dict_list(sync_dict, 'msresolution', resolution) # sync_dict['mstraceno'] = "''" self.add_value_to_sync_dict_list( sync_dict, 'msimagedate', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/ReceiveTime')) # sync_dict['fusefilename'] = "''" self.add_value_to_sync_dict_list( sync_dict, 'dsometadatajson', object_table_data.value_by_name(0, 'dsometadataxml_bus', '')) # sync_dict['bandcount'] = "''" # sync_dict['bandname'] = "''" # sync_dict['cloudpercent'] = "''" # 数据量 self.add_value_to_sync_dict_list(sync_dict, 'datacount', 1) # 密级 # sync_dict['secrecylevel'] = "''" # 行政区码 # sync_dict['regioncode'] = "''" # 行政区 # sync_dict['regionname'] = "''" # 产品时间 # sync_dict['producetime'] = "'{0}'".format( # xml.get_element_text_by_xpath_one('/Metadatafile/BasicDataContent/ProduceDate')) # resolution self.add_value_to_sync_dict_list( sync_dict, 'resolution', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Resolution')) # 色彩模式 # sync_dict['colormodel'] = "''" # 像素位数 # sync_dict['piexldepth'] = "''" # 比例尺分母 # sync_dict['scale'] = "''" # 主要星源 self.add_value_to_sync_dict_list( sync_dict, 'mainrssource', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/SatelliteID')) self.add_value_to_sync_dict_list( sync_dict, 'remark', xml.get_element_text_by_xpath_one( '/Metadatafile/BasicDataContent/Description')) return sync_dict
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 get_sync_predefined_dict_list(self, insert_or_updata) -> list: """ insert_or_updata 指明配置的是更新还是插入,-1时为插入,0为更新 本方法的写法为强规则,调用add_value_to_sync_dict_list配置 第一个参数为list,第二个参数为字段名,第三个参数为字段值,第四个参数为特殊配置 datacount:数据数量 secrecylevel:密级 colormodel:色彩模式 piexldepth:像素位数 """ sync_dict_list = list() object_table_id = self._obj_id object_table_data = self._dataset self.add_value_to_sync_dict_list(sync_dict_list, 'aprid', object_table_id) dsometadataxml = object_table_data.value_by_name( 0, 'dsometadataxml_bus', '') dsometadataxml_xml = CXml() dsometadataxml_xml.load_xml(dsometadataxml) # 加载查询出来的xml self.add_value_to_sync_dict_list( # 通过本方法配置需要的字典集合 sync_dict_list, 'productname', # 配置字段名 dsometadataxml_xml.get_element_text_by_xpath_one( '/root/DSName')) # 配置字段值 self.add_value_to_sync_dict_list(sync_dict_list, 'producttype', self._obj_type_code) self.add_value_to_sync_dict_list( sync_dict_list, 'dsodatatype', object_table_data.value_by_name(0, 'dsodatatype', '')) self.add_value_to_sync_dict_list( sync_dict_list, 'begdate', CUtils.to_day_format( dsometadataxml_xml.get_element_text_by_xpath_one( '/root/BeginDate'), '')) self.add_value_to_sync_dict_list( sync_dict_list, 'enddate', CUtils.to_day_format( dsometadataxml_xml.get_element_text_by_xpath_one( '/root/EndDate'), '')) self.add_value_to_sync_dict_list( sync_dict_list, 'imagedate', CUtils.to_day_format( dsometadataxml_xml.get_element_text_by_xpath_one('/root/Date'), '')) # datacount:数据数量 self.add_value_to_sync_dict_list( sync_dict_list, 'datacount', ''' (select count(dsoid) FROM dm2_storage_object WHERE dsoparentobjid='{0}') '''.format(object_table_id), self.DataValueType_SQL) # secrecylevel:密级 regioncode = dsometadataxml_xml.get_element_text_by_xpath_one( '/root/RegionCode') self.add_value_to_sync_dict_list( # regioncode:行政区码 sync_dict_list, 'regioncode', regioncode) self.add_value_to_sync_dict_list( # regionname:行政区 sync_dict_list, 'regionname', dsometadataxml_xml.get_element_text_by_xpath_one( '/root/RegionName')) self.add_value_to_sync_dict_list( sync_dict_list, 'centerx', ''' (select centerx::decimal(8,2) from ro_global_dim_space where gdscode='{0}') '''.format(regioncode), self.DataValueType_SQL) self.add_value_to_sync_dict_list( sync_dict_list, 'centery', ''' (select centery::decimal(8,2) from ro_global_dim_space where gdscode='{0}') '''.format(regioncode), self.DataValueType_SQL) self.add_value_to_sync_dict_list( sync_dict_list, 'geomwkt', "st_astext(" "(select gdsgeometry from ro_global_dim_space where gdscode='{0}')" ")".format(regioncode), self.DataValueType_SQL) self.add_value_to_sync_dict_list( sync_dict_list, 'geomobj', "(select gdsgeometry from ro_global_dim_space where gdscode='{0}')" .format(regioncode), self.DataValueType_SQL) self.add_value_to_sync_dict_list( sync_dict_list, 'browserimg', object_table_data.value_by_name(0, 'dso_browser', '')) self.add_value_to_sync_dict_list( sync_dict_list, 'thumbimg', object_table_data.value_by_name(0, 'dso_thumb', '')) self.add_value_to_sync_dict_list( sync_dict_list, 'producetime', CUtils.to_day_format( dsometadataxml_xml.get_element_text_by_xpath_one('/root/Date'), '')) self.add_value_to_sync_dict_list( # resolution:分辨率 sync_dict_list, 'resolution', dsometadataxml_xml.get_element_text_by_xpath_one( '/root/Resolution')) self.add_value_to_sync_dict_list( sync_dict_list, 'imgsize', "(select round((sum(dodfilesize)/1048576),2) from dm2_storage_obj_detail " "where dodobjectid in " "(select dsoid FROM dm2_storage_object WHERE dsoparentobjid='{0}')" ")".format(object_table_id), self.DataValueType_SQL) # colormodel:交插件处理 # piexldepth:交插件处理 if insert_or_updata: self.add_value_to_sync_dict_list(sync_dict_list, 'isdel', '0') now_time = CUtils.any_2_str( datetime.datetime.now().strftime('%F %T')) self.add_value_to_sync_dict_list(sync_dict_list, 'addtime', now_time) self.add_value_to_sync_dict_list( sync_dict_list, 'extent', "(select gds_geo_bbox from ro_global_dim_space where gdscode='{0}')" .format(regioncode), self.DataValueType_SQL) # self.add_value_to_sync_dict_list( # sync_dict_list, 'proj', object_table_data.value_by_name(0, 'dso_prj_wkt', ''), self.DB_True) self.add_value_to_sync_dict_list( sync_dict_list, 'remark', dsometadataxml_xml.get_element_text_by_xpath_one('/root/Remark')) # ispublishservice:暂时为空 self.add_value_to_sync_dict_list(sync_dict_list, 'queryable', '1') self.add_value_to_sync_dict_list( sync_dict_list, 'mainrssource', dsometadataxml_xml.get_element_text_by_xpath_one( '/root/MajorSource')) self.add_value_to_sync_dict_list( sync_dict_list, 'scale', dsometadataxml_xml.get_element_text_by_xpath_one( '/root/ScaleDenominator')) self.add_value_to_sync_dict_list( sync_dict_list, 'dsdid', object_table_data.value_by_name(0, 'query_dataset_directory_id', '')) self.add_value_to_sync_dict_list( sync_dict_list, 'imagedatetag', self.transform_time_to_imagedatetag( dsometadataxml_xml.get_element_text_by_xpath_one( '/root/Date'))) return sync_dict_list