gpt4 book ai didi

xml - 如何使用Powershell创建xml文件的子集或过滤掉xml文件的子节点?

转载 作者:行者123 更新时间:2023-12-03 00:00:54 26 4
gpt4 key购买 nike

我有一个如下的xml文件

...
<body>
<node1 attribute1="attr1">
<child1 attribute1="A">
<grandchild>
</grandchild>
</child1>
<child2 attribute1="B">
<grandchild>
</grandchild>
</child2>
</node1>
<node2 attribute1="attr1">
<child1 attribute1="A">
<grandchild>
</grandchild>
</child1>
<child2 attribute1="B">
<grandchild>
</grandchild>
</child2>
</node2>
</body>

我想使用Powershell来创建仅具有所有child1节点或仅具有所有child2节点的另一个xml文件。

我也读过一些有关xslt转换的内容,但也不熟悉。

谢谢你的帮助。

最佳答案

这是一个替代解决方案,不使用xpath,而是使用字符串替换和正则表达式。它非常有效,可以一行编写(请看最后一行)。

我的文件如下:

<?xml version="1.0" encoding="utf-8"?>
<body>
<node1 attribute1="attr1">
<child1 attribute1="A">
<grandchild>
</grandchild>
</child1>
<child2 attribute1="B">
<grandchild>
</grandchild>
</child2>
</node1>
<node2 attribute1="attr1">
<child1 attribute1="A">
<grandchild>
</grandchild>
</child1>
<child2 attribute1="B">
<grandchild>
</grandchild>
</child2>
</node2>
</body>

我首先使用 $a-raw参数将其作为单个字符串加载到var( Get-Content)中。
$a =Get-Content 'D:\temp\M4.xml' -raw

然后,我使用正则表达式将您不需要的节点替换为零。
$a -replace '(?sm)     <child1.*?Child1>\r\n','' | set-content 'd:\temp\filewithoutchild1.xml'

结果是:
<?xml version="1.0" encoding="utf-8"?>
<body>
<node1 attribute1="attr1">
<child2 attribute1="B">
<grandchild>
</grandchild>
</child2>
</node1>
<node2 attribute1="attr1">
<child2 attribute1="B">
<grandchild>
</grandchild>
</child2>
</node2>
</body>

正则表达式中的技巧是(?sm),您会发现一个很好的解释 here

使用一行:
(Get-Content 'D:\temp\M4.xml' -raw) -replace '(?sm)     <child1.*?Child1>\r\n','' | set-content 'd:\temp\filewithoutchild1.xml'

于2015年5月5日编辑

因此,现在工作文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<body>
<node1 attribute1="attr1">
<child1 attribute1="A">
<grandchild>
</grandchild>
</child1>
<child1 attribute1="B">
<grandchild>
</grandchild>
</child1>
<child1 attribute1="C">
<grandchild>
</grandchild>
</child1>
</node1>
<node2 attribute1="attr1">
<child1 attribute1="A">
<grandchild>
</grandchild>
</child1>
<child1 attribute1="B">
<grandchild>
</grandchild>
</child1>
<child1 attribute1="C">
<grandchild>
</grandchild>
</child1>
</node2>
</body>

这是允许您仅选择所需子节点的代码。尽管它在技术上可行,但我对此并不感到骄傲。

我使用相同的方式,但是这次我循环删除标签,而标签只存在您需要的标签。在示例中,我保留“C”国家/地区代码。
Clear-Host

$a =Get-Content 'D:\temp\M.xml' -raw
$reg = [regex]'(?sm)( <child1.*?</child1>)'
$tagMatches = $reg.Matches($a)

$blRemoved = $true
while ($blRemoved)
{
$tagMatches = $reg.Matches($a)
$blRemoved = $false
foreach ($tagMatch in $tagMatches)
{
if ($tagMatch.value -notlike "*`"C`"*")
{
Write-Host $tagMatch.value
$a = $a.Remove($tagMatch.Index,$tagMatch.Length+4)
$blRemoved = $true
break
}
}
}

$a

关于xml - 如何使用Powershell创建xml文件的子集或过滤掉xml文件的子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29925791/

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