You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将API返回的XML订单详情插入SQL数据库表的需求

拆分XML订单数据并插入数据库

需求:将API返回的XML格式订单数据插入数据库表,当同一订单ID对应多个商品时,为每个商品单独插入一条包含该订单ID的记录。

期望插入结果:

row #1  order id: i6tp-pucp-dsrx-1gg7-ikef  item_no: 2304
row #2  order id: i6tp-pucp-dsrx-1gg7-ikef  item_no: 10914

API返回的XML数据:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:result xmlns:ns1="url.xsd">
<ns1:orders>
    <ns1:order>
        <ns1:code>i6tp-pucp-dsrx-1gg7-ikef</ns1:code>
        <ns1:status>CONFIRMED</ns1:status>
        <ns1:date>2022-11-30T20:50:36.920</ns1:date>
        <ns1:deliveryAddress>
            <ns1:firstName>fname</ns1:firstName>
            <ns1:lastName>lastname</ns1:lastName>
            <ns1:streetname>streetname </ns1:streetname>
            <ns1:streetnumber>stno</ns1:streetnumber>
            <ns1:town>town</ns1:town>
            <ns1:postalCode>PLZ</ns1:postalCode>
            <ns1:gender>FEMALE</ns1:gender>
            <ns1:deliveryAddressType>address</ns1:deliveryAddressType>
        </ns1:deliveryAddress>
        <ns1:paymentAddress>
            <ns1:firstName>fname</ns1:firstName>
            <ns1:lastName>lastname</ns1:lastName>
            <ns1:streetname>streetname </ns1:streetname>
            <ns1:streetnumber>stno</ns1:streetnumber>
            <ns1:town>town</ns1:town>
            <ns1:postalCode>PLZ</ns1:postalCode>
            <ns1:gender>FEMALE</ns1:gender>
        </ns1:paymentAddress>
        <ns1:currency>EUR</ns1:currency>
        <ns1:entries>
            <ns1:entry>
                <ns1:sku>2304</ns1:sku>
                <ns1:quantity>1</ns1:quantity>
                <ns1:basePrice>18.49</ns1:basePrice>
                <ns1:totalBasePrice>18.49</ns1:totalBasePrice>
                <ns1:merchantSubTotal>18.49</ns1:merchantSubTotal>
                <ns1:totalPrice>18.49</ns1:totalPrice>
                <ns1:name>ArtNo1</ns1:name>
                <ns1:taxClass>at-vat-full</ns1:taxClass>
                <ns1:warehouse>001-default-warehouse</ns1:warehouse>
            </ns1:entry>
            <ns1:entry>
                <ns1:sku>10914</ns1:sku>
                <ns1:quantity>1</ns1:quantity>
                <ns1:basePrice>49.99</ns1:basePrice>
                <ns1:totalBasePrice>49.99</ns1:totalBasePrice>
                <ns1:merchantSubTotal>49.99</ns1:merchantSubTotal>
                <ns1:totalPrice>49.99</ns1:totalPrice>
                <ns1:name>Artno2</ns1:name>
                <ns1:taxClass>at-vat-full</ns1:taxClass>
                <ns1:warehouse>001-default-warehouse</ns1:warehouse>
            </ns1:entry>
        </ns1:entries>
        <ns1:cancelOrders/>
        <ns1:returnOrders/>
        <ns1:delayOrders/>
        <ns1:consignments/>
        <ns1:totalBasePrice>68.48</ns1:totalBasePrice>
        <ns1:merchantDiscountTotal>0</ns1:merchantDiscountTotal>
        <ns1:merchantSubTotal>68.48</ns1:merchantSubTotal>
        <ns1:marketplaceDiscountTotal>0</ns1:marketplaceDiscountTotal>
        <ns1:subtotal>68.48</ns1:subtotal>
        <ns1:deliveryCost>0.0</ns1:deliveryCost>
        <ns1:paymentCost>0.0</ns1:paymentCost>
        <ns1:totalPrice>68.48</ns1:totalPrice>
        <ns1:paymentMode>payment</ns1:paymentMode>
        <ns1:deliveryMode>E+2</ns1:deliveryMode>
        <ns1:additionalDeliveryOption>E2_1</ns1:additionalDeliveryOption>
        <ns1:deliveryConfiguration>Post</ns1:deliveryConfiguration>
        <ns1:shipmentDate>2022-12-02T07:00:11.680</ns1:shipmentDate>
        <ns1:estimatedDeliveryDate>2022-12-06T07:00:11.680</ns1:estimatedDeliveryDate>
        <ns1:avisoData>
            <ns1:address>
                <ns1:line>line1</ns1:line>
                <ns1:line>line2</ns1:line>
                <ns1:line>line3</ns1:line>
            </ns1:address>
            <ns1:phone>0123456789</ns1:phone>
            <ns1:email>info@gmail.com</ns1:email>
        </ns1:avisoData>
    </ns1:order>
</ns1:orders>
</ns1:result>

解决方案

步骤1:解析XML数据

XML带有命名空间ns1,解析时需处理命名空间映射。以Python为例,用xml.etree.ElementTree提取订单ID和商品SKU:

import xml.etree.ElementTree as ET

# 替换为实际API响应文本
xml_content = """上述XML字符串"""

# 命名空间映射
namespace = {'ns1': 'url.xsd'}
root = ET.fromstring(xml_content)

# 提取订单ID
order_id = root.find('.//ns1:order/ns1:code', namespace).text

# 提取所有商品SKU
item_skus = [entry.text for entry in root.findall('.//ns1:entry/ns1:sku', namespace)]

步骤2:批量插入数据库

假设数据库表结构(MySQL为例):

CREATE TABLE order_items (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_id VARCHAR(50) NOT NULL,
    item_no VARCHAR(20) NOT NULL,
    INDEX idx_order_id (order_id)
);

用Python的mysql-connector执行批量插入:

import mysql.connector

# 数据库连接配置,替换为实际信息
db_config = {
    'user': 'your_username',
    'password': 'your_password',
    'host': 'localhost',
    'database': 'your_db'
}

# 构造插入数据
insert_rows = [(order_id, sku) for sku in item_skus]

# 执行插入
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()

insert_sql = "INSERT INTO order_items (order_id, item_no) VALUES (%s, %s)"
cursor.executemany(insert_sql, insert_rows)

conn.commit()
cursor.close()
conn.close()

SQL Server直接解析方案

如果使用SQL Server,可通过OPENXML直接解析XML并插入:

DECLARE @xml XML = '上述XML字符串'

;WITH XMLNAMESPACES ('url.xsd' AS ns1)
INSERT INTO order_items (order_id, item_no)
SELECT 
    order_node.value('(ns1:code)[1]', 'VARCHAR(50)') AS order_id,
    item_node.value('(ns1:sku)[1]', 'VARCHAR(20)') AS item_no
FROM @xml.nodes('/ns1:result/ns1:orders/ns1:order') AS orders(order_node)
CROSS APPLY order_node.nodes('ns1:entries/ns1:entry') AS items(item_node)

内容的提问来源于stack exchange,提问作者naim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:55:13