xml - XML子树-仅选择指定的子节点,但与父节点一起选择

标签 xml powershell xpath xquery

我有一个简单但巨大的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/

相关文章:

powershell - 如何将参数传递给 jenkins 管道中的 powershell 脚本

Python requests 模块 - 将嵌套 XML 作为查询参数传递

php - 使用命名空间从 XML 中提取数据

xml - Xlsx 样式填充图案错误

powershell - 具有一个可选参数,需要另一个参数

powershell - 如何在按列列出的网格中编写按字典顺序排序的列表?

php - xpath 排除具有类的元素

xpath - 无法使用 RemoteWebDriver.FindElementsByXPath ("/"找到根元素);

c# - 包含正斜杠 (/) 的属性的 XPath 查询

java - 在 Java 中访问网络,命令行参数?