使用python将xml数据导入MYSQL数据库

使用python将xml数据导入MYSQL数据库,python,sql,xml,Python,Sql,Xml,在将XML数据导入SQL时遇到属性问题,我尝试了4或5种不同的方法,但一定是错误地看待了这个问题。我是python新手,但有SQL和其他一些语言的经验 使用xpath尝试了几种不同的方法,但仍然不起作用 <?xml version="1.0" encoding="UTF-8"?> <PARTS> <Header> <Version>6.5</Version> </Header> <

在将XML数据导入SQL时遇到属性问题,我尝试了4或5种不同的方法,但一定是错误地看待了这个问题。我是python新手,但有SQL和其他一些语言的经验 使用xpath尝试了几种不同的方法,但仍然不起作用

<?xml version="1.0" encoding="UTF-8"?>
<PARTS>
    <Header>
        <Version>6.5</Version>
    </Header>
    <Items>
        <Item MaintenanceType="A">
            <HazardousMaterialCode>N</HazardousMaterialCode>
            <ItemLevelGTIN GTINQualifier="UP">00651860733074</ItemLevelGTIN>
            <PartNumber>14-230615</PartNumber>
            <BrandAAIAID>BBGL</BrandAAIAID>
            <BrandLabel>Bilstein</BrandLabel>
            <ACESApplications>Y</ACESApplications>
            <ItemQuantitySize UOM="EA">1.0</ItemQuantitySize>
            <ContainerType>BX</ContainerType>
            <QuantityPerApplication Qualifier="MAX" UOM="EA">1</QuantityPerApplication>
        </Item>
    </Items>
</PARTS>

from xml.etree import ElementTree
import mysql.connector

file_name = 'bsn.xml'
dom = ElementTree.parse(file_name)

mydb = mysql.connector.connect(user='frank', password='xxxxxx', host='127.0.0.1', database='scoresre', auth_plugin='mysql_native_password')
mycursor = mydb.cursor()

item = dom.findall('Items/Item')

for x in item:
    PartNumber = x.find('PartNumber').text
    BrandAAIAID = x.find('BrandAAIAID').text
    BrandLabel = x.find('BrandLabel').text
    ItemLevelGTIN = x.find('ItemLevelGTIN').text
    GTINQualifier = x.find('.//GTINQualifier[@attr="UP"]')
    print(PartNumber, BrandAAIAID, BrandLabel, ItemLevelGTIN, GTINQualifier)

    val = (PartNumber, BrandAAIAID, BrandLabel, ItemLevelGTIN, GTINQualifier)

    sql = "INSERT INTO scoreitem (B15_PartNumber, B20_BrandAAIAID, B25_BrandLabel, B10_ItemLevelGTIN, " \
          "B11_GTINQualifier) VALUES (%s, %s, %s, %s, %s)"

    mycursor.execute(sql, val)
    mydb.commit()
代码未导入下的属性 GTINQualifier=UP-UP作为null输入 ItemQuantitySize UOM=EA-当我使用上述相同的语法和 限定符=MAX UOM=EA MAX,EA也以NULL形式输入。提前感谢您

解决方案A: 这个解决方案就是您试图做的

items=dom.findall'items/Item' 在目标列列表中的任何属性之前使用“@”。这会有帮助的 我们将属性与常规标记分开处理。 target_cols=['PartNumber','brandaiaid','BrandLabel','ItemLevelGTIN','@GTINQualifier'] 对于项目中的项目: 实例_dict=dict 对于目标列中的列: 标签=列替换@, 如果col.startswith@: 实例_dict.update{col:item.find'/*[@{}]'.formatlabel.attrib[label]} 其他: 实例_dict.update{col:item.findlabel.text} val=目标列中列名称的tupleinstance列dict[列名称] 打印实例 **在这里写入数据库** 解决方案B: 下面是一个将xml数据作为dataframe/dict读入的解决方案,然后您可以获取需要写入db的字段

让我们制作一些数据 我引入了一个虚拟的第二个标记来检查它是否正确地处理了多个标记

xml_字符串= 6.5 N 00651860733074 14-230615 BBGL 比尔施泰因 Y 1 BX 1. N 00651860733084 14-230620 BBGL 比尔斯泰恩斯 Y 1 BX 1. 解决方案 (可选)使用pandas将整个xml视为数据帧

导入库 作为pd进口熊猫 从xml.etree导入ElementTree作为ET 导入mysql.connector 现在递归地读取每个标记并写入数据库

target_cols=['PartNumber','brandaiaid','BrandLabel','ItemLevelGTIN','GTINQualifier'] sql=插入到scoreitem B15_零件号、B20_Brandaiaid、B25_BrandLabel、B10_ItemLevelGTIN、\ B11gtinQualifier值%s、%s、%s、%s、%s dict_cols=[None]包含None或等于target_cols的列表 write_to_db=False在写入db时将其设置为true 文件名='bsn.xml' 让我们先用xml_字符串进行测试 设置“xml\u source\u is\u file=True” 使用文件时。 xml\u source\u是\u file=False 如果xml_源_是_文件: dom=ET.parsefile\u名称 其他: dom=ET.fromstringxml\u字符串 如果将_写入_数据库: mydb=mysql.connector.connectuser='frank',密码='xxxxxx', host='127.0.0.1', 数据库='scoresre', auth\u plugin='mysql\u native\u password' mycursor=mydb.cursor 合并dict=dict 对于listdom中的xx: 如果xx.tag=='Items': 打印列表xx 对于i,枚举xx中的项目: 实例_dict=dict 打印列表项 对于列表项中的ee: 受印者 kee=ee.tag.替换“@”, 如果kee in dict_cols或dict_cols[0]为无: 实例_dict.update{kee:ee.text} 如果是被安装者,请说明: 对于列表中的e: 版画 ke=e.tag.替换“@”, 如果dict_cols或dict_cols[0]中的ke为无: 实例_dict.update{ke:e.text} 温度=e.attrib 如果lentemp_dict>0: 对于临时目录键中的jj: kjj=jj。替换“@”, 如果dict_cols或dict_cols[0]中的kjj为无: 实例_dict.update{kjj:temp_dict.getjj} temp_dict=ee.attrib 如果lentemp_dict>0: 对于临时目录键中的jj: kjj=jj。替换“@”, 如果dict_cols或dict_cols[0]中的kjj为无: 实例_dict.update{kjj:temp_dict.getjj} 打印实例 合并目录更新{i:instance目录} val=目标列中列名称的tupleinstance列dict[列名称] printval 在这里写入数据库 如果将_写入_数据库: mycursor.executesql,val mydb.commit df=pd.DataFrameconsolidated_dict.T df PS:注意有两个开关,write_to_db和xml_source_is_file。在你的情况下,你会
需要将两者都设置为True,才能写入数据库并从xml文件中读取数据。

@Fgerster:如果您认为此响应帮助您解决了问题,请将其向上投票,并接受此响应作为已接受的答案。