代码之家  ›  专栏  ›  技术社区  ›  Christian Townsend

是否在类型值上创建XPath筛选?

  •  0
  • Christian Townsend  · 技术社区  · 3 年前

    我有以下XML(这是更大文档的一部分):

     <class type="I want to filter on whatever value this is">
        <instance name="QuestionSet4">
          <property name="QuestionSetName">QuestionSet4</property>
          <property name="Ratio">5</property>
        </instance>
        <instance name="QuestionSetTrust">
          <property name="QuestionSetName">QuestionSetTrust</property>
          <property name="Ratio">5</property>
        </instance>
      </class>
    

    我的目标是使用PowerShell的 Select-Xml 这样我就可以把这两个 name type ,因此输出如下所示:

    QuestionSetName, Ratio
    QuestionSet4, 5
    QuestionSetTrust, 5
    

    班级 类型 在文档中是唯一的,因此我想知道是否可以基于此进行过滤,而不是像下面这样硬编码元素:

    /root/class[3]/@type
    

    而是 /root/class/@type="I want to filter on whatever value this is"...

    实例名称将在不同的文档中更改,因此我也无法对此进行筛选。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Mathias R. Jessen    3 年前

    您可以解决相关问题 instance 具有如下XPath表达式的节点:

    //class[@type = 'I want to filter on whatever value this is']/instance
    

    $xml |Select-Xml -XPath "//class[@type = 'I want to filter on whatever value this is']/instance" |ForEach-Object { 
      [pscustomobject]@{
        QuestionSetName = ($_.Node |Select-Xml "./property[@name='QuestionSetName']").Node.InnerText
        Ratio           = ($_.Node |Select-Xml "./property[@name='Ratio']").Node.InnerText
      }
    }
    

    如果你有很多 <property /> 要为每个元素枚举的元素 <instance />

    $propertyNames = 'QuestionSetName','Ratio','Size','SomeOtherProperty'
    
    $xml |Select-Xml -XPath "//class[@type = 'I want to filter on whatever value this is']/instance" |ForEach-Object { 
      $properties = [ordered]@{}
      foreach($name in $propertyNames){
        $properties[$name] = ($_.Node |Select-Xml "./property[@name='${name}']").Node.InnerText
      }
    
      [pscustomobject]$properties
    }