如何在Powershell中获得子XML节点的所有父节点

todd1215

因此,我一直在研究其中存储有文件夹结构的XML文件,并且希望能够验证文件系统中是否存在该文件夹结构。尽管有很多方法可以尝试执行此操作“ Resolve-Path”,“ Get-ChildItems”等……我希望能够构建XML结构中的路径并将其放入字符串或我可以找到的东西针对它运行测试路径。听起来很简单吧?可能对于一些经验丰富的Powershell经验丰富的人来说可能是这样,但是我对PS还是陌生的,并且在解决这个问题时有些困难。

这是带有目录结构的XML示例

<config>
    <local>
        <setup>
            <folder name="FolderA" type="root">
                <folder name="FolderC"/>
                <folder name="FolderB">
                    <folder name="FolderD" type="thisone"/>
                </folder>
            </folder>
        </setup>
    </local>
</config>

如果子节点设置为FolderD,则最终目标是构建类似于以下内容的字符串

FolderA\FolderB\FolderD

对我来说,显而易见的是,要获得完整路径,您必须从末尾开始并向后移动节点树,然后就迷路了。目的是从可能存在的多个路径中仅选择一个路径。因此,例如,我想检查FolderD的路径。因此,我只需要构建该路径\ FolderA \ FolderB \ FolderD,然后忽略其余路径即可。

mklement0

最简单的方法可能是:

  • 识别目标叶子节点
  • 循环遍历层次结构,并从name属性值构建路径,直到type=root命中节点
$xmlDoc = [xml] @'
<config>
    <local>
        <setup>
            <folder name="FolderA" type="root">
                <folder name="FolderC"/>
                <folder name="FolderB">
                    <folder name="FolderD" type="thisone"/>
                </folder>
            </folder>
        </setup>
    </local>
</config>
'@

# Get the leaf element of interest.
$leafNode = $xmlDoc.SelectSingleNode('//folder[@type="thisone"]')

# Simply build up the path by walking up the node hierarchy
# until an element with attribute type="root" is found.
$path = $leafNode.name
$node = $leafNode
while ($node.type -ne 'root') {
  $node = $node.ParentNode
  $path = $node.name + '\' + $path         #'# (ignore this - fixes syntax highglighting)
} 

# Output the resulting path:
#  FolderA\FolderB\FolderD
$path

基于问题原始形式的原始答案:关于使用递归从元素属性自上而下构建路径的问题仍可能会引起人们的兴趣

通过递归,您仍然可以采用自顶向下的方法:

$xmlDoc = [xml] @'
<folder name="FolderA">
    <folder name="FolderC"/>
    <folder name="FolderB">
        <folder name="FolderD"/>
    </folder>
</folder>
'@

# Define a function that walks the specified XML element's hierarchy to 
# down its leaf elements, building up a path of the values of the 
# specified attribute, and outputting the path for each leaf element.
function get-LeafAttribPaths($xmlEl, $attrName, $parentPath) {  
  $path = if ($parentPath) { join-path $parentPath $xmlEl.$attrName } else
                           { $xmlEl.$attrName }
  if ($xmlEl.ChildNodes.Count) { # interior element -> recurse over children
    foreach ($childXmlEl in $xmlEl.ChildNodes) {
      get-LeafAttribPaths $childXmlEl $attrName $path 
    }
  } else { # leaf element -> output the built-up path
    $path
  }
}

# Invoke the function with the document element of the XML document
# at hand and the name of the attribute from whose values to build the path.
$paths = get-LeafAttribPaths $xmlDoc.DocumentElement 'name'

# Output the resulting paths.
# With the above sample input:
#  FolderA\FolderC
#  FolderA\FolderB\FolderD
$paths

# Test paths for existence.
Test-Path $paths

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用powershell仅导入父节点而从xml文件中保留所有子节点?

来自分类Dev

如何在JavaFX中获得父节点中的所有节点?

来自分类Dev

如何在xmlstring中删除所有子节点的父节点

来自分类Dev

如何在sql / oracle中选择节点的所有子节点和父节点

来自分类Dev

如何在arangodb中显示完全嵌套层次结构的给定节点的所有所有子/父节点

来自分类Dev

如何在NotePad ++中删除折叠的XML节点(和所有子节点)

来自分类Dev

如何在sql中为xml的所有子节点添加属性

来自分类Dev

获取Groovy中XML节点的所有子节点的值

来自分类Dev

如何在xml中读取子节点

来自分类Dev

如何在事件侦听器中将父节点与其所有子节点相关联?jQuery / JavaScript

来自分类Dev

创建具有特定父节点值及其 XML 的所有子节点值的 Map

来自分类Dev

如果选择了所有子节点,PowerShell .NET仅检索父节点

来自分类Dev

如何使用vb.net在树视图控件中从下到上查找子节点的所有父节点

来自分类Dev

父节点值为其所有子节点之和

来自分类Dev

php树获取子节点的所有父节点的列表

来自分类Dev

当XML父节点和子节点具有相同的名称时,如何使用LINQ to XML

来自分类Dev

在Firebase中父节点的所有实例中查询特定的子节点

来自分类Dev

查找Oracle 10g中任何父节点的所有子节点

来自分类Dev

如何在C ++中遍历treeview控件的所有父节点?

来自分类Dev

如何查询父重复节点内的重复 XML 子节点?

来自分类Dev

在igTree中扩展特定节点时如何扩展节点的所有子节点?

来自分类Dev

如何在立交桥涡轮中获得特定区域中的所有住宅节点?

来自分类Dev

拉取 SQL Server 中的所有子 XML 节点

来自分类Dev

如何在C ++中获取非二叉树中特定节点的所有子节点

来自分类Dev

仅选择父节点的子节点,并从图中消除(临时)cytoscape.js中的所有其他节点

来自分类Dev

在 PowerShell 中更改 XML 节点中的所有键

来自分类Dev

如何使用python将嵌套的子节点添加到xml文档中的父节点?

来自分类Dev

使用Powershell-通过将现有子节点保留在现有xml文件中来添加父节点。

来自分类Dev

识别TreeView中的所有父节点

Related 相关文章

  1. 1

    如何使用powershell仅导入父节点而从xml文件中保留所有子节点?

  2. 2

    如何在JavaFX中获得父节点中的所有节点?

  3. 3

    如何在xmlstring中删除所有子节点的父节点

  4. 4

    如何在sql / oracle中选择节点的所有子节点和父节点

  5. 5

    如何在arangodb中显示完全嵌套层次结构的给定节点的所有所有子/父节点

  6. 6

    如何在NotePad ++中删除折叠的XML节点(和所有子节点)

  7. 7

    如何在sql中为xml的所有子节点添加属性

  8. 8

    获取Groovy中XML节点的所有子节点的值

  9. 9

    如何在xml中读取子节点

  10. 10

    如何在事件侦听器中将父节点与其所有子节点相关联?jQuery / JavaScript

  11. 11

    创建具有特定父节点值及其 XML 的所有子节点值的 Map

  12. 12

    如果选择了所有子节点,PowerShell .NET仅检索父节点

  13. 13

    如何使用vb.net在树视图控件中从下到上查找子节点的所有父节点

  14. 14

    父节点值为其所有子节点之和

  15. 15

    php树获取子节点的所有父节点的列表

  16. 16

    当XML父节点和子节点具有相同的名称时,如何使用LINQ to XML

  17. 17

    在Firebase中父节点的所有实例中查询特定的子节点

  18. 18

    查找Oracle 10g中任何父节点的所有子节点

  19. 19

    如何在C ++中遍历treeview控件的所有父节点?

  20. 20

    如何查询父重复节点内的重复 XML 子节点?

  21. 21

    在igTree中扩展特定节点时如何扩展节点的所有子节点?

  22. 22

    如何在立交桥涡轮中获得特定区域中的所有住宅节点?

  23. 23

    拉取 SQL Server 中的所有子 XML 节点

  24. 24

    如何在C ++中获取非二叉树中特定节点的所有子节点

  25. 25

    仅选择父节点的子节点,并从图中消除(临时)cytoscape.js中的所有其他节点

  26. 26

    在 PowerShell 中更改 XML 节点中的所有键

  27. 27

    如何使用python将嵌套的子节点添加到xml文档中的父节点?

  28. 28

    使用Powershell-通过将现有子节点保留在现有xml文件中来添加父节点。

  29. 29

    识别TreeView中的所有父节点

热门标签

归档