[英]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 中的示例)
然后对于每个“ListsValuesIDs”,收集子节点信息:
我首先尝试了以下操作(加载 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.