【发布时间】:2016-03-02 15:37:57
【问题描述】:
我有两个大型(> 100MB,每个数百万行)XML 文件,其结构如下。
<?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-Object 和Get-Content,但我遇到的问题之一是每个 XML 文件中的其他属性。两个 XML 文件都可能有
index/doc/field name=part/val - 12345-678
但不同之处在于 xmlfile1 的 norm & flags 属性值可能与 xmlfile2 不同。这使得使用 Compare-Object 和 Get-Content 标记所有内容。
使用 Powershell,您将如何进行比较忽略“噪声”属性,但仅匹配 <value> 上的 PART 属性?
编辑
澄清一下 - 第二个 XML 文件与所示的几乎相同。但是 - 可能不同的是 XML 中的 <doc id='0'>,<field name='PART' 相同,但其他属性 norm='-1' 和 flags='Idfp--S--Ni08--------'> 可能不同。我想找到 PART 属性,忽略 field 中的其余属性,并确定 <val> 中的内容是否存在于第二个 XML 文件中。
【问题讨论】:
-
你有xmlfile2的样本吗?你怎么知道要比较哪些元素?既然你说 PART-value MAY 是一样的,那就没用了。什么是静态的? doc-id 是静态的?
-
@FrodeF.- 为了清楚起见,我添加了更多信息。属性
name将是静态的,但其他属性(norm、flags)可能具有不同的值。其中属性name=PART,我想确定<val>中的内容是否在XML 文件2 中。忽略该行中的其余属性。此外,<doc id=中的值可能不同(两者之间的顺序不同)。
标签: xml powershell compare