创建数据流以将 XML 数据写入发票行项目的 SQL 表。我有如下 XML 源数据(已编辑),在展平后,我隔离了包含键和值的“数据”元素(在 pos_record 下)。如何将其转换为发票行的单行,其中列名称是“键”,列数据是“值”?
<invoice>
<lines>
<line quantity="0.338" unit="kg">
<product name="Plums Pizzaz Organic" product_type="product">
<pos_record>
<data key="id" value="6133"/>
<data key="barcode" value="6133"/>
<data key="name" value="Plums - Black Amber ONLINE, Kg"/>
<data key="price" value="$19.99"/>
<data key="retail_uom" value="KG"/>
<data key="scale" value="true"/>
<data key="tax" value="0.0"/>
<data key="d_1_name" value="Certified Organic Fresh Produce"/>
<data key="d_2_name" value="Fresh Fruit"/>
<data key="d_1_code" value="Certified Organic Fresh Produce"/>
<data key="d_2_code" value="Fresh Fruit"/>
<data key="last_sold" value=""/>
<data key="brand" value=""/>
</pos_record>
</product>
</line>
</lines>
</invoice>
预期输出:
id | 数量 | 单位 | 名字 | 产品类型 | 产品_pos_id | 产品_pos_条形码 | 等等 |
---|---|---|---|---|---|---|---|
1 | 0.338 | 公斤 | 李子 Pizzaz 有机 | 产品 | 6133 | 6133 | 等等 |
n | 数量 | 单位 | 产品名称 | 类型 | pos_id | pos_条形码 | 等等 |
请注意,每张发票包含多个发票行,并且每行在 pos_record 下可能有多个“数据”元素(或没有) - 虽然“数据”元素此时已知,但它们将来可能会发生变化,因此需要动态执行此操作.
为了清晰起见进行了编辑。
您可以使用powershell脚本解析xml然后加载到数据库中
using assembly System.Xml.Linq
$xml = @"
<invoice>
<lines>
<line quantity="0.338" unit="kg">
<product name="Plums Pizzaz Organic" product_type="product">
<pos_record>
<data key="id" value="6133"/>
<data key="barcode" value="6133"/>
<data key="name" value="Plums - Black Amber ONLINE, Kg"/>
<data key="price" value="$19.99"/>
<data key="retail_uom" value="KG"/>
<data key="scale" value="true"/>
<data key="tax" value="0.0"/>
<data key="d_1_name" value="Certified Organic Fresh Produce"/>
<data key="d_2_name" value="Fresh Fruit"/>
<data key="d_1_code" value="Certified Organic Fresh Produce"/>
<data key="d_2_code" value="Fresh Fruit"/>
<data key="last_sold" value=""/>
<data key="brand" value=""/>
</pos_record>
</product>
</line>
</lines>
</invoice>
"@
$doc = [System.Xml.Linq.XDocument]::Parse($xml)
$table = [System.Collections.ArrayList]::new()
$id = 1
foreach($line in $doc.Descendants('line'))
{
$newRow = [pscustomobject]@{}
$newRow | Add-Member -NotePropertyName product_id -NotePropertyValue $id
$newRow | Add-Member -NotePropertyName qty -NotePropertyValue $line.Attribute('quantity').Value
$newRow | Add-Member -NotePropertyName unit -NotePropertyValue $line.Attribute('unit').Value
$newRow | Add-Member -NotePropertyName product_name -NotePropertyValue $line.Element('product').Attribute('name').Value
$newRow | Add-Member -NotePropertyName product_type -NotePropertyValue $line.Element('product').Attribute('product_type').Value
$pos_record = $line.Descendants('pos_record')[0]
foreach($data in $pos_record.Elements('data'))
{
$newRow | Add-Member -NotePropertyName $data.Attribute('key').Value -NotePropertyValue $data.Attribute('value').Value
}
$table.Add($newRow) | out-null
$id++
}
$table