使用python将xml数据导入MYSQL数据库
在将XML数据导入SQL时遇到属性问题,我尝试了4或5种不同的方法,但一定是错误地看待了这个问题。我是python新手,但有SQL和其他一些语言的经验 使用xpath尝试了几种不同的方法,但仍然不起作用使用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 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:如果您认为此响应帮助您解决了问题,请将其向上投票,并接受此响应作为已接受的答案。