将键和值的嵌套 XML 数组转换为 Azure 数据工厂中的单行

问题描述 投票:0回答:1

创建数据流以将 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 下可能有多个“数据”元素(或没有) - 虽然“数据”元素此时已知,但它们将来可能会发生变化,因此需要动态执行此操作.

为了清晰起见进行了编辑。

sql-server xml azure-data-factory data-transform
1个回答
0
投票

您可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.