我有一个简单但巨大的XML文件,其中包含许多<file>
节点,从中我只想选择2个子节点<filename>
和<bytes>
(每个<file>
)。我需要一个查询,该查询将返回仅包含我选择的2个子节点的“简化”节点的集合,如下所示:
<file>
<filename>
<bytes>
</file>
<file>
<filename>
<bytes>
</file>
但是,如果我使用以下查询:
//file/*[self::filename or self::bytes]
,则不会得到2个<file>
节点,而会得到4个子节点:<filename>
<bytes>
<filename>
<bytes>
我的XML文件和PowerShell中的演示:
cls;
[xml]$xml =
@"
<root>
<file>
<filename>file1.txt</filename>
<md5>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</md5>
<bytes>69762</bytes>
<executable>0</executable>
<someothertag>x</someothertag>
</file>
<file>
<filename>file2.txt</filename>
<md5>BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB</md5>
<bytes>78179</bytes>
<executable>0</executable>
<someothertag>y</someothertag>
</file>
</root>
"@
#$xml
"This gives me entire file nodes with all childnodes: "
$result1 = Select-Xml -Xml $xml -XPath "//file"
$result1
Write-Host
"The result is only selected nodes, but separately (without parent node):`n"
$result2 = Select-Xml -Xml $xml -XPath "//file/*[self::filename or self::bytes]"
$result2
有任何想法吗?
聚苯乙烯
我知道我可以通过其他各种方式来完成此操作,但是我特别希望通过xquery完成。
最佳答案
一个简单的XPath表达式是不够的,因为它不能过滤子树。您需要构造新的结果元素。此XQuery表达式创建新的<file/>
元素,并包括所有<filename/>
和<bytes/>
子级:
for $file in //file
return element file {filename, bytes}
如果能够使用XQuery 3.0,则可以使用“简单映射运算符”来表达较短的语法:
//file ! element file {filename, bytes}
关于xml - XML子树-仅选择指定的子节点,但与父节点一起选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25411225/