如何使用Python解析下面的XML数据?

2024-04-24 15:17:14 发布

您现在位置:Python中文网/ 问答频道 /正文

源XML

<?xml version='1.0' encoding='UTF-8'?>
<ProcessType xmlns:xmi="http://www.omg.org/XMI" xmi:version="2.0" defaultContext="Default">
    <node componentName="tRedshiftRow" componentVersion="0.102" offsetLabelX="0" offsetLabelY="0" posX="-32" posY="96">
    <elementParameter field="TECHNICAL" name="QUERYSTORE:QUERYSTORE_TYPE" value="BUILT_IN"/>
    <elementParameter field="TEXT" name="DBNAME" value="&quot;&quot;"/>
    <elementParameter field="TEXT" name="SCHEMA_DB" value="&quot;&quot;"/>
    <elementParameter field="MEMO_SQL" name="QUERY" value="&quot;DELETE FROM schema.tablename;&quot;"/>
    </node>
</ProcessType>

我只想在标记为“QUERY”的地方获取DELETE语句,并将其写入文本文件中

预期输出:从schema.tablename中删除

我尝试了下面的方法,但显然没有成功

from lxml import etree, objectify
import xml.etree.ElementTree as ET

def convert_xml_to_comp():
    metadata = 'source.xml'
    parser = etree.XMLParser(remove_blank_text=True)
    tree = etree.parse(metadata, parser)
    root = tree.getroot()
    for elem in root.getiterator():
        # print(elem)
        i = elem.tag.find('}')
        if i >= 0:
            elem.tag = elem.tag[i+1 :]
    objectify.deannotate(root, cleanup_namespaces=True)
    tree.write('done.xml', pretty_print=True, xml_declaration=True, encoding='UTF-8')


tree = ET.parse('done.xml')
root = tree.getroot()

def get_sql_text():

    file = open( "newdelete.txt", "w")
    for root in tree.getroot():
        ### Get the elements' names ###
        for elementParameter in root.iterfind('elementParameter[@name="UNIQUE_NAME"]') :
                        name=elementParameter.get('value')
                        ### Get the elements' name and SQL ###
                        for elementParameter in root.iterfind('elementParameter[@name="QUERY"]') :
                            #print (root.attrib)
                            val=elementParameter.get('value')
                            print(root.find('val[@value="DELETE FROM schema.tablename;"]'))
    file.close() 
get_sql_text()
if __name__ == '__main__':
    convert_xml_to_comp()

Tags: nameintruetreefieldforgetvalue
1条回答
网友
1楼 · 发布于 2024-04-24 15:17:14

使用xpath查询只需几条语句就可以完成这一切。比如:

>>> from lxml import etree
>>> doc = etree.parse(open('data.xml'))
>>> query = doc.xpath('//elementParameter[@name="QUERY"]')[0].get('value')
>>> print(query)
"DELETE FROM schema.tablename;"

这表示“使用name="QUERY"查找所有elementParameter元素,然后返回第一个元素的value属性值


要仅选择那些在其value属性中包含“DELETE”的元素,请使用contains()函数:

>>> doc.xpath('//elementParameter[@name="QUERY" and contains(@value, "DELETE")]')

相关问题 更多 >