gpt4 book ai didi

xml - Powershell-比较两个大型XML文件的部分

转载 作者:行者123 更新时间:2023-12-02 23:58:44 24 4
gpt4 key购买 nike

我有两个较大的XML文件(> 100MB,每行几百万行),其结构如下。

<?xml version='1.0' encoding='UTF-8'?>
<index>
<doc id='0'>
<field name='PART' norm='-1' flags='Idfp--S--Ni08--------'>
<val>12345-678</val>
</field>
<field name='DESCRIPTION' norm='-1' flags='Idfp--S--Ni08--------'>
<val>Part XYX123 Description</val>
</field>
<field name='QTY' norm='-1' flags='Idfp--S--Ni08--------'>
<val>18</val>
</field>
<field name='VENDOR' norm='-1' flags='Idfp--S--Ni08--------'>
<val>ACME</val>
</field>
<field name='MFG' norm='-1' flags='Idfp--S--Ni08--------'>
<val></val>
</field>
</doc>
<doc id='1'>
<field name='PART' norm='124' flags='Idfp--S--Ni08--------'>
<val>ABCD-1234</val>
</field>
<field name='DESCRIPTION' norm='-1' flags='Idfp--S--Ni08--------'>
<val>PART ABCD Description</val>
</field>
<field name='QTY' norm='-1' flags='Idfp--S--Ni08--------'>
<val>4</val>
</field>
<field name='VENDOR' norm='-1' flags='Idfp--S--Ni08--------'>
<val></val>
</field>
<field name='MFG' norm='-1' flags='Idfp--S--Ni08--------'>
<val></val>
</field>
</doc>
</index>

我需要找到其中一个而不是另一个的项目,反之亦然。最初,我只想比较 PART属性值,但也想比较其他值(描述等)。

我想确定xmlfile1中是否包含什么:
index/doc/field name=part/val - 12345-678

也在xmlfile2中。如果不是,请将其写到text / csv文件中。

我尝试使用 Compare-ObjectGet-Content,但是遇到的问题之一是每个XML文件中的其他属性。这两个XML文件可能都有
index/doc/field name=part/val - 12345-678

但是区别是xmlfile1的norm&flags属性值可能与xmlfile2不同。这使得使用 Compare-ObjectGet-Content标记所有内容。

使用Powershell,如何使比较忽略“noise”属性,而只在 <value>上匹配 PART属性?

编辑

为了澄清-第二个XML文件将与所示的文件几乎相同。但是,两种XML中的 <doc id='0'>可能不同,但是 <field name='PART'相同,但是其他属性 norm='-1'flags='Idfp--S--Ni08--------'>可能彼此不同。我想找到PART属性,忽略 field中的其余属性,并确定 <val>中的内容是否存在于第二个XML文件中。

最佳答案

最有可能找到一个更好的基于XML的答案来搜索XPATH或类似的东西(无论如何我都不是XML专家),但是如果我是我将要做的就是将其全部转换为对象数组。如果您不介意除去字段名称和值之外的规范,标志或其他任何元素,则可以执行以下操作:

[xml]$File1 = Get-Content c:\path\to\file1.xml
[xml]$File2 = Get-Content c:\path\to\file2.xml
$File1Objs = ForEach($Item in $File1.index.doc){
$Obj=[PSCustomObject]@{'id'=$Item.id}
$Item.field|%{
Add-Member -InputObject $Obj -NotePropertyName $_.Name -NotePropertyValue $_.val}
$Obj
}
$File2Objs = ForEach($Item in $File2.index.doc){
$Obj=[PSCustomObject]@{'id'=$Item.id}
$Item.field|%{
Add-Member -InputObject $Obj -NotePropertyName $_.Name -NotePropertyValue $_.val}
$Obj
}
Compare-Object $File1Objs $File2Objs -Property Part -PassThru | Where{$_.SideIndicator -eq '<='}|Select * -Exclude SideIndicator | Export-CSV c:\temp\File1Only.txt
Compare-Object $File1Objs $File2Objs -Property Part -PassThru | Where{$_.SideIndicator -eq '=>'}|Select * -Exclude SideIndicator | Export-CSV c:\temp\File2Only.txt

就像我说的那样,答案可能会更有效,但这应该仍然有效。

关于xml - Powershell-比较两个大型XML文件的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35751679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com