繁体   English   中英

根据 PowerShell 中的模式提取 XML 节点和值

[英]Extracting XML nodes and values based on a pattern in PowerShell

PowerShell 新手。 必须将 100 条代理规则重新创建到不同的代理产品中。 我必须从现有代理导出规则的唯一选项是 XML。

XML 导出的结构是这样的(我感兴趣的 2 个部分,我在我感兴趣的节点周围加上了“**”):

<libraryContent>
  <lists>
    <entry>
      **<string>com.scur.type.string.2988</string>**
      <list>
        <description></description>
        <content>
          <listEntry>
            **<entry>symphony-docker-external.jfrog.io</entry>**
            **<description>IM4452077</description>**
          </listEntry>
        </content>
      </list>
    </entry>
  </lists>

(这些列表中的 100 个)

 <ruleGroup id="291" defaultRights="2" name="Authentication" enabled="true" cycleRequest="true" cycleResponse="false" cycleEmbeddedObject="false" cloudSynced="false">
    <acElements/>
    <description></description>
    <rules>
     **<rule id="3002" enabled="true" name="Allow access to AssetBank">**
        **<description>Catalog Task #SCTASK0020659</description>**
        <actionContainer actionId="com.scur.mainaction.stoprulegroup"/>
        <condition always="false">
          <expressions>
            <conditionExpression openingBracketCount="0" closingBracketCount="0" operatorId="com.scur.operator.isinlist">
              <propertyInstance useMostRecentConfiguration="false" propertyId="com.scur.engine.system.client.ip"/>
              <parameter valueTyp="1" typeId="com.scur.type.list" listTypeId="com.scur.type.ip">
                <value>
                  **<listValue id="com.scur.type.ip.2941"/>**
                </value>
              </parameter>
            </conditionExpression>
            <conditionExpression prefix="AND" openingBracketCount="0" closingBracketCount="0" operatorId="com.scur.operator.equals">
              <propertyInstance useMostRecentConfiguration="false" propertyId="com.scur.engine.system.url.smartmatch">
                <parameters>
                  <entry>
                    <string>com.scur.engine.system.string.domainmagicmatch.domainlist</string>
                    <parameter valueTyp="1">
                      <value>
                        **<listValue id="com.scur.type.string.2988"/>**
                      </value>
                    </parameter>
                  </entry>
                </parameters>
              </propertyInstance>
              <parameter valueTyp="3" valueId="com.scur.type.boolean.true" typeId="com.scur.type.boolean"/>
            </conditionExpression>
          </expressions>
        </condition>
      </rule>
    </rules>
  </ruleGroup>
</libraryContent>

这些规则中有 100 条。

我基本上是在尝试将以下信息放在一起(使用上述 XML 中的示例)

  • 规则 ID: 3002
  • 启用:
  • RuleName:允许访问 AssetBank
  • 规则描述:目录任务 #SCTASK0020659
  • ListsValueIDs: com.scur.type.ip.2941 , com.scur.type.string.2988

然后对于每个“ListsValuesIDs”,收集子节点信息:

  • ListValuesID: com.scur.type.ip.2988
  • 列表条目: symphony-docker-external.jfrog.io
  • 清单说明: IM4452077

我首先尝试了以下操作(加载 XML,然后将我想要的值分配给数组中的对象):

[XML]$XMLRuleSet = get-content ruleset.xml
$XMLRuleSet.libraryContent.ruleGroup.rules.rule.id
$array=@();
ForEach ($LibraryContent in $XMLRuleSet) {
    $LibraryContent
    $tempobj = New-Object PSObject -Property @{
        'id' = $LibraryContent.libraryContent.ruleGroup.rules.rule.id;
        'name' = $LibraryContent.libraryContent.ruleGroup.rules.rule.name;
        'enabled' = $LibraryContent.libraryContent.ruleGroup.rules.rule.enabled;
        'ruleDescription' = $LibraryContent.libraryContent.ruleGroup.rules.rule.description;
        'listvalueID' = $LibraryContent.libraryContent.ruleGroup.rules.rule.condition.expressions.conditionExpression.parameter.value.listValue;
  } 

    $array += $tempobj
}

$array

问题在于每个规则总是有超过 1 个“ listValueID ”,因此当我尝试将 CSV 中的数组导出到更远的代码时,我得到以下信息:

@{name=System.Object[]; id=System.Object[]; enabled=System.Object[]}

我绝对不想将我的值导出到数组和 CSV 中(它可以在一个文件中,每个值都带有回车符或其他任何东西),这正是我在搜索如何使用 XML 后认为最好的方法电源外壳。

尝试使用Select -index 0获取第一个元素(如果有)。

例如: $LibraryContent.libraryContent.ruleGroup.rules.rule.condition.expressions.conditionExpression.parameter.value.listValue | Select -index 0; $LibraryContent.libraryContent.ruleGroup.rules.rule.condition.expressions.conditionExpression.parameter.value.listValue | Select -index 0;

或者,您可以执行...parameter.value.listValue[0]但与Select不同,如果没有找到,这可能会崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM