xml - 需要帮助在 XML 文件中插入子节点
问题描述
在 PowerShell 中需要帮助来更正 XML 文件。我要在此处插入的节点不是 XML 文件的第一个子节点。当前文件的结构 - 这是当前文件,我需要帮助
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Shipment xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" >
<ShipmentNumber>0012546776</ShipmentNumber>
<Container>Selleys/Yates</Container>
<Extnl_id/>
<AddressForwardingAgent>
<PartnerNumber>0000400260</PartnerNumber>
<LanguageKey>EN</LanguageKey>
<Name>TEST</Name>
<HouseandStreet>TEST1</HouseandStreet>
</AddressForwardingAgent>
<AddressSender>
<TransportPlanningPoint>4001</TransportPlanningPoint>
<LanguageKey>EN</LanguageKey>
<Name>TEST2</Name>
<HouseandStreet>TEST2</HouseandStreet>
</AddressSender>
<Consignment>
<ConsignmentNumber>0001</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>X</DangerousGoodsIndicator>
<GrossWeight>2005.268</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>3.856</TotalVolume>
<VolumeUOM>M3</VolumeUOM>
</ConsignmentHeader>
<ConsignmentNumber>0002</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>X</DangerousGoodsIndicator>
<GrossWeight>21.12</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>0.044</TotalVolume>
<VolumeUOM>M3</VolumeUOM>
</ConsignmentHeader>
<ConsignmentNumber>0003</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>Y</DangerousGoodsIndicator>
<GrossWeight>12.45</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>0.056</TotalVolume>
<VolumeUOM>P3</VolumeUOM>
</ConsignmentHeader>
</Consignment>
预期输出 - 我希望使用 PowerShell 在 XML 中获得这种结构。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Shipment xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" >
<ShipmentNumber>0012546776</ShipmentNumber>
<Container>Selleys/Yates</Container>
<Extnl_id/>
<AddressForwardingAgent>
<PartnerNumber>0000400260</PartnerNumber>
<LanguageKey>EN</LanguageKey>
<Name>TEST</Name>
<HouseandStreet>TEST1</HouseandStreet>
</AddressForwardingAgent>
<AddressSender>
<TransportPlanningPoint>4001</TransportPlanningPoint>
<LanguageKey>EN</LanguageKey>
<Name>TEST2</Name>
<HouseandStreet>TEST2</HouseandStreet>
</AddressSender>
<Consignment>
<ConsigmentLine> ## Need to insert this tag here
<ConsignmentNumber>0001</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>X</DangerousGoodsIndicator>
<GrossWeight>2005.268</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>3.856</TotalVolume>
<VolumeUOM>M3</VolumeUOM>
</ConsignmentHeader>
</ConsigmentLine>
<ConsigmentLine> ## Need to insert this tag here
<ConsignmentNumber>0002</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>X</DangerousGoodsIndicator>
<GrossWeight>21.12</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>0.044</TotalVolume>
<VolumeUOM>M3</VolumeUOM>
</ConsignmentHeader>
</ConsigmentLine>
<ConsigmentLine> ## Need to insert this tag here
<ConsignmentNumber>0003</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>Y</DangerousGoodsIndicator>
<GrossWeight>12.45</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>0.056</TotalVolume>
<VolumeUOM>P3</VolumeUOM>
</ConsignmentHeader>
</ConsigmentLine>
</Consignment>
解决方案
您需要先捕获“ConsignmentNumber”和“ConsignmentHeader”节点,从 xml 中删除“Consignment”节点并重建它。
对于演示,我使用的是 Here-String,但您可能需要使用从文件中读取它[xml]$xml = Get-Content -Path 'D:\MyCurrentXml.xml'
[xml]$xml = @"
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Shipment xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" >
<ShipmentNumber>0012546776</ShipmentNumber>
<Container>Selleys/Yates</Container>
<Extnl_id/>
<AddressForwardingAgent>
<PartnerNumber>0000400260</PartnerNumber>
<LanguageKey>EN</LanguageKey>
<Name>TEST</Name>
<HouseandStreet>TEST1</HouseandStreet>
</AddressForwardingAgent>
<AddressSender>
<TransportPlanningPoint>4001</TransportPlanningPoint>
<LanguageKey>EN</LanguageKey>
<Name>TEST2</Name>
<HouseandStreet>TEST2</HouseandStreet>
</AddressSender>
<Consignment>
<ConsignmentNumber>0001</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>X</DangerousGoodsIndicator>
<GrossWeight>2005.268</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>3.856</TotalVolume>
<VolumeUOM>M3</VolumeUOM>
</ConsignmentHeader>
<ConsignmentNumber>0002</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>X</DangerousGoodsIndicator>
<GrossWeight>21.12</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>0.044</TotalVolume>
<VolumeUOM>M3</VolumeUOM>
</ConsignmentHeader>
<ConsignmentNumber>0003</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>Y</DangerousGoodsIndicator>
<GrossWeight>12.45</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>0.056</TotalVolume>
<VolumeUOM>P3</VolumeUOM>
</ConsignmentHeader>
</Consignment>
</Shipment>
"@
要以您想要的方式重建它,这应该可以工作:
# capture two arrays of nodes for 'ConsignmentNumber' and 'ConsignmentHeader'
$numbers = $xml.Shipment.Consignment.ChildNodes | Where-Object { $_.LocalName -eq 'ConsignmentNumber' }
$headers = $xml.Shipment.Consignment.ChildNodes | Where-Object { $_.LocalName -eq 'ConsignmentHeader' }
# remove the entire 'Consignment' node from the xml
$xml.Shipment.RemoveChild($xml.Shipment.Consignment)
# and create a new 'Consignment' node
$newConsignment = $xml.CreateElement('Consignment')
# loop through the arrays, create a new 'ConsigmentLine' node and add the captured nodes to it
for ($i = 0; $i -lt $numbers.Count; $i++) {
$lineNode = $xml.CreateElement('ConsigmentLine')
$lineNode.AppendChild($numbers[$i])
$lineNode.AppendChild($headers[$i])
# append this to the newly created 'Consignment' node
$newConsignment.AppendChild($lineNode)
}
# finally, append the new 'Consignment' node to the 'Shipment' node
$xml.Shipment.AppendChild($newConsignment)
# and save the xml
$xml.Save('D:\MyCorrectedXml.xml')
结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Shipment xmlns:xsi="http://www.w3.org/2001/xmlschema-instance">
<ShipmentNumber>0012546776</ShipmentNumber>
<Container>Selleys/Yates</Container>
<Extnl_id />
<AddressForwardingAgent>
<PartnerNumber>0000400260</PartnerNumber>
<LanguageKey>EN</LanguageKey>
<Name>TEST</Name>
<HouseandStreet>TEST1</HouseandStreet>
</AddressForwardingAgent>
<AddressSender>
<TransportPlanningPoint>4001</TransportPlanningPoint>
<LanguageKey>EN</LanguageKey>
<Name>TEST2</Name>
<HouseandStreet>TEST2</HouseandStreet>
</AddressSender>
<Consignment>
<ConsigmentLine>
<ConsignmentNumber>0001</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>X</DangerousGoodsIndicator>
<GrossWeight>2005.268</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>3.856</TotalVolume>
<VolumeUOM>M3</VolumeUOM>
</ConsignmentHeader>
</ConsigmentLine>
<ConsigmentLine>
<ConsignmentNumber>0002</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>X</DangerousGoodsIndicator>
<GrossWeight>21.12</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>0.044</TotalVolume>
<VolumeUOM>M3</VolumeUOM>
</ConsignmentHeader>
</ConsigmentLine>
<ConsigmentLine>
<ConsignmentNumber>0003</ConsignmentNumber>
<ConsignmentHeader>
<DangerousGoodsIndicator>Y</DangerousGoodsIndicator>
<GrossWeight>12.45</GrossWeight>
<WeightUOM>KG</WeightUOM>
<TotalVolume>0.056</TotalVolume>
<VolumeUOM>P3</VolumeUOM>
</ConsignmentHeader>
</ConsigmentLine>
</Consignment>
</Shipment>
PS您的示例xml缺少最后的结束</Shipment>
标记
推荐阅读
- javascript - Discord.js 出现“TypeError:Client.Collection 不是构造函数”错误
- extjs - Sencha Architect 卡在加载中
.. 永远的建筑师 4.3.0 - ruby-on-rails - 尝试在 Ruby on Rails 7.0.0 中安装设计时出错
- node.js - 使用 NodeJS 在 mongo 查询中得到错误的查询
- angular - Angular 12 - formControlName 必须与父 formGroup 指令错误一起使用
- ios - 在 SwiftUI 中,如何在执行手势时不断更新视图?
- android - 升级 kotlin 或 gradle 时出现 Room kapt 错误
- javascript - 如何在反应中使用另一个类的变量状态?
- applescript - AppleScript 问题使用 sip 更改图片的分辨率
- r - R ggplot facet_wrap 有条件