修改此正则表达式以仅选择紧邻的特定标签而不是同级标签

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

我正在使用 Visual Studio Code 对充满 XML 文件的文件夹运行查找/替换。

我需要删除具有特定字符串“S00BBABHK”的所有 LineItem 节点。

注意:此代码的格式是为了清晰起见,我正在使用的文件中的实际 XML 是一行,并且没有以任何方式格式化。

            <LineItem sequence="0">
                ...
                    <Item id="GOOD_1" />
                ...
            </LineItem>     
            <LineItem sequence="0">
                ...
                    <Item id="GOOD_2" />
                ...
            </LineItem>
            <LineItem sequence="0">
                ...
                    <Item id="S00BBABHK" />
                ...
            </LineItem>
            <LineItem sequence="0">
                ...
                    <Item id="Good3" />
                ...
            </LineItem>     

这是示例文件的内容。 注意:这些文件仅包含一行,并且未以任何方式格式化。

<ICSMXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.icsm.com/icsmxml"><Header><MsgDelivery><To><Credential><Domain>ICSMID</Domain><Identity>196M</Identity></Credential></To><From><Credential><Domain>ICSMID</Domain><Identity>LVS</Identity></Credential></From><Sender><Credential><Domain>DNS</Domain><Identity>BOSSAPI</Identity></Credential></Sender></MsgDelivery><MsgHeader><MessageId>40cb9826-e2e0-4ca2-8de7-08ab9f601cc4</MessageId><Timestamp>2024-04-10T07:12:52</Timestamp><DocumentId>ICSMPO</DocumentId></MsgHeader><ConversationState><ConversationId>9790f6aa-2225-461b-8c85-cd97e7ee2577</ConversationId></ConversationState></Header><Request deploymentMode="production"><OrderRequest><OrderRequestHeader orderDate="2024-04-09" orderID="SA1403865" type="new" orderType="regular" shippingType="item"><CustomerIdentification><CustomerInfo name="PONumber">33475712</CustomerInfo><CorporateInfo name="AccountNumber">Lovesac</CorporateInfo></CustomerIdentification></OrderRequestHeader><LineItem sequence="0"><CustomerIdentification><CorporateInfo name="unitOfMeasureQty">1</CorporateInfo><CorporateInfo name="unitTransferCost">0.000000</CorporateInfo><CorporateInfo name="SellCode">E</CorporateInfo></CustomerIdentification><LineItemConfiguration /><LineItemShipping domain="ICSM" carrier="P" serviceLevel="PF"><ShipTo><Address><Name>Brianna Eales</Name><PostalAddress addressID=""><DeliverTo>Brianna Eales</DeliverTo><Street>5010 RENO DR</Street><Street /><City>PASADENA</City><State>TX</State><PostalCode>77505-2156</PostalCode><Country>United States</Country></PostalAddress></Address></ShipTo></LineItemShipping><PartnerItemDetail type="point" lineNumber="5" quantity="1" unitOfMeasure="EA"><Item id="S00BBABHK" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail><PartnerItemDetail type="production" lineNumber="5" quantity="1" unitOfMeasure="EA"><Item id="S00BBABHK" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail></LineItem><LineItem sequence="0"><CustomerIdentification><CorporateInfo name="unitOfMeasureQty">1</CorporateInfo><CorporateInfo name="unitTransferCost">0.000000</CorporateInfo><CorporateInfo name="SellCode">E</CorporateInfo></CustomerIdentification><LineItemConfiguration /><LineItemShipping domain="ICSM" carrier="P" serviceLevel="PF"><ShipTo><Address><Name>Brianna Eales</Name><PostalAddress addressID=""><DeliverTo>Brianna Eales</DeliverTo><Street>5010 RENO DR</Street><Street /><City>PASADENA</City><State>TX</State><PostalCode>77505-2156</PostalCode><Country>United States</Country></PostalAddress></Address></ShipTo></LineItemShipping><PartnerItemDetail type="point" lineNumber="6" quantity="1" unitOfMeasure="EA"><Item id="UM6494" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail><PartnerItemDetail type="production" lineNumber="6" quantity="1" unitOfMeasure="EA"><Item id="UM6494" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail></LineItem><LineItem sequence="0"><CustomerIdentification><CorporateInfo name="unitOfMeasureQty">1</CorporateInfo><CorporateInfo name="unitTransferCost">0.000000</CorporateInfo><CorporateInfo name="SellCode">E</CorporateInfo></CustomerIdentification><LineItemConfiguration /><LineItemShipping domain="ICSM" carrier="P" serviceLevel="PF"><ShipTo><Address><Name>Brianna Eales</Name><PostalAddress addressID=""><DeliverTo>Brianna Eales</DeliverTo><Street>5010 RENO DR</Street><Street /><City>PASADENA</City><State>TX</State><PostalCode>77505-2156</PostalCode><Country>United States</Country></PostalAddress></Address></ShipTo></LineItemShipping><PartnerItemDetail type="point" lineNumber="7" quantity="1" unitOfMeasure="EA"><Item id="UM5562" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail><PartnerItemDetail type="production" lineNumber="7" quantity="1" unitOfMeasure="EA"><Item id="UM5562" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail></LineItem><LineItem sequence="0"><CustomerIdentification><CorporateInfo name="unitOfMeasureQty">1</CorporateInfo><CorporateInfo name="unitTransferCost">0.000000</CorporateInfo><CorporateInfo name="SellCode">E</CorporateInfo></CustomerIdentification><LineItemConfiguration /><LineItemShipping domain="ICSM" carrier="P" serviceLevel="PF"><ShipTo><Address><Name>Brianna Eales</Name><PostalAddress addressID=""><DeliverTo>Brianna Eales</DeliverTo><Street>5010 RENO DR</Street><Street /><City>PASADENA</City><State>TX</State><PostalCode>77505-2156</PostalCode><Country>United States</Country></PostalAddress></Address></ShipTo></LineItemShipping><PartnerItemDetail type="point" lineNumber="8" quantity="1" unitOfMeasure="EA"><Item id="UM5467" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail><PartnerItemDetail type="production" lineNumber="8" quantity="1" unitOfMeasure="EA"><Item id="UM5467" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail></LineItem><LineItem sequence="0"><CustomerIdentification><CorporateInfo name="unitOfMeasureQty">1</CorporateInfo><CorporateInfo name="unitTransferCost">0.000000</CorporateInfo><CorporateInfo name="SellCode">E</CorporateInfo></CustomerIdentification><LineItemConfiguration /><LineItemShipping domain="ICSM" carrier="P" serviceLevel="PF"><ShipTo><Address><Name>Brianna Eales</Name><PostalAddress addressID=""><DeliverTo>Brianna Eales</DeliverTo><Street>5010 RENO DR</Street><Street /><City>PASADENA</City><State>TX</State><PostalCode>77505-2156</PostalCode><Country>United States</Country></PostalAddress></Address></ShipTo></LineItemShipping><PartnerItemDetail type="point" lineNumber="9" quantity="1" unitOfMeasure="EA"><Item id="UM3925" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail><PartnerItemDetail type="production" lineNumber="9" quantity="1" unitOfMeasure="EA"><Item id="UM3925" /><Price valueType="unit"><Money currency="USD">0.000000</Money></Price><Price valueType="extended"><Money currency="USD">0.00</Money></Price></PartnerItemDetail></LineItem></OrderRequest></Request></ICSMXML>

我正在使用以下正则表达式:

`<LineItem.*?sequence="[^>]*>.*(?=S00BBABHK).*<\/LineItem>`

如果在任何节点中找到查询字符串,则选择给定文件中的所有 LineItem 节点。

我不知道如何修改它以仅选择包含查询字符串的 LineItem 节点。

这不是脚本的一部分。我在 VS Code 中使用正则表达式作为搜索/替换查询。 (Mac、OS 12.7.4、Visual Studio Code 1.86.2)我每天都会修改一批这些内容(直到上游源解决问题)。

提前感谢您的指导和耐心。

xml
1个回答
0
投票

使用使用 Xml Linq 的 Powershell 脚本

using assembly System.Xml.Linq
$input_filename = 'c:\temp\test.xml'
$output_filename = 'c:\temp\test1.xml'

$doc = [System.Xml.Linq.XDocument]::Load($input_filename)
$items = $doc.Descendants('LineItem').Foreach( [System.Xml.Linq.XElement])
$length = $items.Count - 1
for($i = $length; $i -ge 0; $i--)
{
   $item = $items[$i]
   $id = $item.Element('Item').Attribute('id').Value
   if($id -eq 'S00BBABHK') { $item.Remove() }
}
$doc.Save($output_filename)
© www.soinside.com 2019 - 2024. All rights reserved.