perl - XML SIMPLE PERL - 循环通过子节点问题
问题描述
我有一些 perl 代码
my $res = $ua->get( $access->to_url );
if ($res->is_success) {
my $ref = XMLin( $res->content );
my $xml = new XML::Simple;
$data = $xml->XMLin($res->content,ForceArray => 1);
#print $res->content;
for my $purchase ( @{ $data->{PurchaseOrders}->{PurchaseOrder}} )
这点还好。。。。
当我尝试循环遍历子元素时,如果只有一个子元素
我收到“不是数组引用”错误
for my $item ( @{$purchase->{LineItems}->{LineItem}} )
{
$itemCode = $item->{ItemCode};
}
XML 结构是这样的
PurchaseOrders
PurchaseOrder
LineItems
LineItem
我知道 xml simple 的一个问题,我必须强制数组,但我不确定如何在子节点上强制数组
我发现这篇关于 stackoverflow 的文章似乎非常接近我的确切问题,但我正在努力解决如何在我的代码中执行它
$VAR1 = {
'PurchaseOrderID' => '82fa50d6-fd45-4fd2-b42d-035aaaa39a2c',
'LineAmountTypes' => 'Exclusive',
'SentToContact' => 'true',
'AttentionTo' => 'sxxxx',
'Status' => 'AUTHORISED',
'LineItems' => {
'LineItem' => {
'LineAmount' => '57.61',
'Quantity' => '1.0000',
'UnitAmount' => '57.6100',
'LineItemID' => 'e295d55d-68bd',
'Description' => 'xxx',
'ItemCode' => 'xxx',
'TaxAmount' => '11.52',
'AccountCode' => '310',
'TaxType' => 'INPUT2'
}
},
'UpdatedDateUTC' => '2018-10-26T14:19:19.053',
'CurrencyCode' => 'GBP',
'Contact' => {
包括我的打印转储器中的一个片段 - 请注意,它只是重要部分的片段,一切都很好,直到它到达订单项
这里也是 XML 文件
<PurchaseOrder>
<PurchaseOrderID>82fa50</PurchaseOrderID>
<PurchaseOrderNumber>PO-0029</PurchaseOrderNumber>
<Date>2018-10-26T00:00:00</Date>
<DeliveryDate>2018-10-28T00:00:00</DeliveryDate>
<DeliveryAddress>Address/DeliveryAddress>
<AttentionTo>XXX</AttentionTo>
<SentToContact>true</SentToContact>
<Reference>000000078</Reference>
<CurrencyRate>1.000000</CurrencyRate>
<CurrencyCode>GBP</CurrencyCode>
<Contact>
<ContactID>f203ed00-8cd1-4e4d-9b76-f5e7d90a3c19</ContactID>
<ContactStatus>ACTIVE</ContactStatus>
<Name>XXX</Name>
<FirstName>XXXy</FirstName>
<LastName>XXX</LastName>
<Addresses>
<Address>
<AddressType>XXX</AddressType>
<AddressLine1>XXX</AddressLine1>
<AddressLine2>XXX</AddressLine2>
<City>XXX</City>
<Region>XXX</Region>
<PostalCode>XXX</PostalCode>
<Country>GBR</Country>
</Address>
<Address>
<AddressType>XXX</AddressType>
<AddressLine1>Unit 1-3</AddressLine1>
<AddressLine2>XXX</AddressLine2>
<City>XXX</City>
<Region>West Yorkshire</Region>
<PostalCode>POSTCODE</PostalCode>
<Country>GBR</Country>
</Address>
</Addresses>
<UpdatedDateUTC>2018-10-08T17:19:55.083</UpdatedDateUTC>
<DefaultCurrency>GBP</DefaultCurrency>
</Contact>
<BrandingThemeID>2ffe566f-7a88-486a-938c-639d27966197</BrandingThemeID>
<Status>AUTHORISED</Status>
<LineAmountTypes>Exclusive</LineAmountTypes>
<LineItems>
<LineItem>
<ItemCode>xxx</ItemCode>
<Description>des</Description>
<UnitAmount>57.6100</UnitAmount>
<TaxType>INPUT2</TaxType>
<TaxAmount>11.52</TaxAmount>
<LineAmount>57.61</LineAmount>
<AccountCode>310</AccountCode>
<Quantity>1.0000</Quantity>
<LineItemID>e295d55d-68bd-41b0-a0b1-cf1f2d5b7a4f</LineItemID>
</LineItem>
</LineItems>
<SubTotal>57.61</SubTotal>
<TotalTax>11.52</TotalTax>
<Total>69.13</Total>
<UpdatedDateUTC>2018-10-26T14:19:19.053</UpdatedDateUTC>
<HasAttachments>false</HasAttachments>
</PurchaseOrder>
解决方案
通过使用返回可理解 XML 树的对象的 XML 解析器,您可以避免 ForceArray 问题和混淆数据结构。如果您了解 CSS, Mojo::DOM是一个不错的选择。
use Mojo::DOM;
my $dom = Mojo::DOM->new->xml(1)->parse($res->decoded_content);
for my $purchase ($dom->find('PurchaseOrders > PurchaseOrder')->each) {
# $purchase is a Mojo::DOM object representing a PurchaseOrder element
for my $item ($purchase->find('LineItems > LineItem')->each) {
# It's unclear if ItemCode is an an attribute or a sub-element; assuming sub-element
my $itemCode = $item->at('ItemCode')->text;
...
}
}
XML::LibXML是另一个可以类似使用的选项,但使用 XPath 或 DOM 而不是 CSS 来定位元素。
use XML::LibXML qw( );
my $doc = XML::LibXML->load_xml(string => $res->decoded_content);
for my $purchase ($doc->findodes('/PurchaseOrders/PurchaseOrder')) {
# $purchase is a XML::LibXML::Element object representing a PurchaseOrder element
for my $item ($purchase->findnodes('LineItems/LineItem')) {
# It's unclear if ItemCode is an an attribute or a sub-element; assuming sub-element
my $itemCode = $item->findvalue('ItemCode');
...
}
}
推荐阅读
- javascript - 更改 background-position CSS 属性会导致重排吗?
- go - 使用 kube 客户端创建 hostPath 持久卷
- arrays - 为什么将字符“T”附加到此代码?
- node.js - 节点 pkg-npm 没有找到/添加 index.html 到他的节点可执行文件 (index.win.exe)
- thumbnails - 如果视频来自本地库文件夹,则视频缩略图生成失败
- php - 带有子数组的 PHP Spatie DTO
- design-patterns - 在 Julia 模块中自动导出函数的语法
- c# - C#如何构建动态对象
- python - 为什么表情符号☘️有时看起来像☘?
- ssl-certificate - 错误 503 无法快速获取颁发者证书 CDN