【问题标题】:Differentiate Tag Name and attribute "name" XML PowerShell区分标记名称和属性“名称”XML PowerShell
【发布时间】:2012-06-06 10:12:39
【问题描述】:

我有一个如下所示的 XML 输入:

<?xml version="1.0" encoding="utf-8"?>
 <Content>
    <section name="FileID"/>
    <FileID>109F2AEA-6D9C-4127-963A-9C71D4155C5D</FileID>
       <File Path="C:\test.config">
          <Tag TagName="configuration"/>
       </File>
 </Content>

当我在 PowerShell 中使用以下代码行对每个节点进行递归搜索以识别名称为“FileID”的节点时:

if($ConfigChildItem.Name -eq "FileID")
{
    ...
}

$ConfigChildItem 以递归方式填充 XML 中的节点以进行搜索。 通过这个,我期望得到名称为“FileID”的节点,例如:

<FileID>109F2AEA-6D9C-4127-963A-9C71D4155C5D</FileID>

但它会输出如下标签:

<section name="FileID"/>

因为它们的属性“name”的值为“FileID”。 如何仅获取名称为“FileID”的标签,而不是属性名称为“name”且这些属性的值为“FileID”的标签?

【问题讨论】:

    标签: xml powershell xmlnode xml-attribute


    【解决方案1】:

    其中一种方法(使用 xpath):

    $xml = [XML] @'
    <?xml version="1.0" encoding="utf-8"?>
     <Content>
        <section name="FileID"/>
        <FileID>109F2AEA-6D9C-4127-963A-9C71D4155C5D</FileID>
           <File Path="C:\test.config">
              <Tag TagName="configuration"/>
           </File>
     </Content>
    '@
    
    $expression = "Content/FileID"
    $navigator = $xml.PSBase.CreateNavigator()
    $node = $navigator.Evaluate($expression)
    $node | Select OuterXml # or any other properties
    

    根据您的评论进行编辑:

    $xml = [xml](Get-Content "c:\temp\test.xml")
    $xml.SelectSingleNode("//FileID")  | ?{ $_.InnerText -eq "109F2AEA-6D9C-4127-963A-9C71D4155C5D" } | %{ $_.InnerText = "blah" }
    $xml.Save("c:\temp\test.xml")
    

    【讨论】:

    • 感谢您的回答。这可行,但问题是,“FileID”标签可以出现在任何级别,这就是为什么我依靠递归搜索来识别标签。
    • 您可以使用“//FileID”作为xpath表达式来查找任何级别的所有FileID。
    • 但是,搜索是为了编辑输出节点的内容并保存回xml文件,然后这种从XML输入中单独提取内容的方式会很乏味。有没有更好的方法来完成这项工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多