2
我有两个大型(> 100MB,每个数百万行)XML文件,其结构如下。Powershell - 比较两个大型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。如果不是,请将其写入文本/ csv文件。
我试过使用Compare-Object
& Get-Content
,但我遇到的其中一个问题是每个XML文件中的其他属性。这两个XML文件可能有
index/doc/field name=part/val - 12345-678
,但不同的是,xmlfile1可能有不同的值常态&标志比xmlfile2属性。这使得使用Compare-Object
& Get-Content
标记一切。
使用Powershell,您将如何进行比较忽略“噪音”属性,但只匹配PART
属性的<value>
?
EDIT
为了澄清 - 第二XML文件将是几乎相同所示。然而 - 什么可能是不同的是<doc id='0'>
在任何XML中,<field name='PART'
将是相同的,但其他属性norm='-1'
和flags='Idfp--S--Ni08--------'>
可能会在每个不同。我想查找PART属性,忽略field
中的其余属性,并确定<val>
中的内容是否存在于第二个XML文件中。
你有没有xmlfile2的样本?你如何知道要比较哪些元素?既然你说PART-MAY可能是一样的,那就没用了。什么是静态的?文档ID的静态? –
@ FrodeF.-为了清晰起见,我添加了一些更多信息。属性'name'将是静态的,但其他('norm','flags')可能具有不同的值。在属性'name = PART'中,我想确定''中的内容是否在XML文件2中。忽略该行中其余的属性。此外,'
就像我说的,有可能是一个更有效答案,但这应该是有效的。
来源
2016-03-02 19:24:45 TheMadTechnician
我需要更有效的答案。对于2个大的XML文件,在我可以加载第一个XML文件之前,'Get-Content'会给出一个'Out of Memory'错误。适用于小文件。 –
我会使用与@TheMadTechnician的答案相同类型的解决方案,但它确实需要一点内存(至少当你有大文件时)。但是有一些方法可以优化它。你说它在内存不足
Get-Content
。Get-Content
使用每行一个字符串创建一个对象数组。既然我们要将它转换为xml文档,我们可以将该文件读为一个简单的字符串,这会为我们节省大量内存。如果仍有问题,您可能需要在具有更多资源的计算机上运行此脚本。当我们可以将整个文件保存到内存中时,XML解析更容易。
你也可以用你来自哪里,文件1存储值的基于哈希表的解决方案和价值,当你阅读文件2与比较。例如:
输出:
这仅仅是一个使用正则表达式验证的概念。使用像这样的文本解析解决方案(使用前面的哈希表来存储值),您可以使用
StreamReader
一次读取一行,以最大限度地减少内存使用量。来源
2016-03-03 16:39:18