【发布时间】:2018-12-15 04:53:26
【问题描述】:
我正在尝试根据客户发送给我们的 xml 文件自动创建销售订单。
他们的 XML 文件的结构因不同客户而异,因此我创建了一个 SQL Server 表,其中包含每个客户的基本订单信息的路径。
$salesOrder 包含整个 XML 文件。
SQL数据被加载到$customerTemplate,订单行被加载到一个名为$SalesOrderLines的数组中:
$salesOrderLines = @($salesOrder.SelectNodes($customerTemplate.LinePath))
问题是当我遍历订单行数组时,例如:
foreach ($salesOrderLine in $salesOrderLines) {
$partCode = ($salesOrderLine.SelectSingleNode($customerTemplate.PartCodePath)).'#text'
}
它适用于第一个订单行,即它选择正确的零件代码,但对于任何后续订单行 $partCode 保持相同的值。即使我在循环结束时清除了 $partCode 变量,当它拾取第二个订单行时,$partCode 从第一个订单行获取值 - 尽管我可以看到 $orderLine 包含我的正确属性我正在寻找。
我是否错过了一些明显的事情,因为在尝试解决这个问题 2 天后我没有取得太大进展?如有必要,我可以提供整个脚本,但我认为要求任何人检查 300 行代码的要求太大了。
具有单个订单行的 XML 示例:
<?xml version="1.0"?>
<eExact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="eExact-Schema.xsd">
<Orders>
<Order type="B" number="23298">
<OrderedAt>
<Creditor code="100001" number="100001" type="S">
<Name>Widget Co</Name>
<ExternalCode>EW001</ExternalCode>
</Creditor>
<Date>2018-01-31</Date>
</OrderedAt>
<OrderLine lineNo="1">
<Description>Widget Sub Assy Std</Description>
<Item code="12345" type="S" searchcode="">
<Description>Widget Sub Assy Std</Description>
</Item>
<Quantity>1</Quantity>
<ItemCode>12345</ItemCode>
</OrderLine>
</Order>
</Orders>
</eExact>
这是重现问题的代码示例:
[xml]$salesOrder = Get-Content -Path "C:\Temp\PurchaseOrder.xml"
$salesOrderLines = @($salesOrder.SelectNodes("/eExact/Orders/Order/OrderLine"))
foreach ($salesOrderLine in $salesOrderLines) {
$partCode = ($salesOrderLine.SelectSingleNode("//ItemCode")).'#text'
$orderQty = ($salesOrderLine.SelectSingleNode("//Quantity")).'#text'
$salesOrderLine.InnerXml
"Part code = $partCode, Qty = $orderQty"
Clear-Variable partCode, orderQty
}
使用 2 行顺序,这给出了输出:
<Description>Widget Sub Assy Std</Description><Item code="12345" type="S" searchcode=""><Description>Widget Sub Assy Std</Description></Item><Quantity>1</Quantity><ItemCode>12345</ItemCode>
Part code = 12345, Qty = 1
<Description>Big Widget</Description><Item code="54321" type="S" searchcode=""><Description>Big Widget</Description></Item><Quantity>3</Quantity><ItemCode>54321</ItemCode>
Part code = 12345, Qty = 1
有了更多的订单行,我只会得到更多相同的第一个零件编号和数量的重复。 我希望第二行的输出是:
零件代码 = 54321,数量 = 3【问题讨论】:
-
你能从你的 XML 中提供一个净化的 sn-p 吗?
-
还有你的(失败的)代码的minimal reproducible example。我们无法在不知道您的输入参数(
$salesOrderLines、$customerTemplate)和所需输出的情况下调试您发布的代码 sn-p。
标签: xml powershell xpath edi