使用 powershell 使用布尔值更新 xml 属性
Updating an xml attribute with boolean value using powershell
我有一个样本 XML 如下:
<?xml version="1.0" encoding="utf-8"?>
<Searchable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" label="$RESX('Ebr.Crdm.Store.2_0','Item','Item')" xmlns="http://sysrepublic.com/Secure/4.0/DSL/SearchService">
<Fields>
<Field data-type="System.Int64" is-editable="true" id="item_transactionid" label="$RESX('Ebr.Crdm.Store.2_0','TransactionID','Transaction ID')" is-mandatory-display-field="false" is-hidden-display-field="false" is-virtual-date-time="false" is-display-field-only="false" use-utc-datetime="true" apply-user-timezone-offset="false" show-date="true" show-time="true" is-favourite="false" common-field="true">
<FieldDescription primary-key="false" nullable="false" readonly="false" hidden="true" format="text" enable-required-validation="true" />
<Operators>
<Operator name="equal" />
<Operator name="notequal" />
<Operator name="greaterthan" />
<Operator name="greaterthanequal" />
<Operator name="lessthan" />
<Operator name="lessthanequal" />
<Operator name="between" />
<Operator name="notbetween" />
<Operator name="in" />
<Operator name="notin" />
</Operators>
<LeftExpression>
<Field data-type="System.Int64" common-field="true">
<CollectionDescription collection="pos.CRDM_Item">
<Relationship parent="pos.CRDM_Header">
<RelatedField from="TransactionID" to="TransactionID" common-to-field="true" />
<RelatedField from="TradingDay" to="TradingDay" common-to-field="true" />
</Relationship>
</CollectionDescription>
<Description>TransactionID</Description>
</Field>
</LeftExpression>
</Field>
</Fields>
</Searchable>
下面是我试过的 powershell 代码:
$xmlFile = "C:\Users\rparpani\Desktop\test2.xml"
[xml]$xml = Get-Content $xmlFile -Raw
$nodes = $xml.SelectNodes("//Field[@id = 'item_transactionid']")
foreach ($node in $nodes)
{
$node.is-hidden-display-field = 'True'
}
xml.Save('C:\Users\rparpani\Desktop\test2.xml')
似乎有不同的方法来更新布尔属性。我正在尝试将 is-hidden-display-field 从 false 更改为 true。有人可以建议我的代码有什么问题吗
您的 XML 文档使用 命名空间 ,因此您无法定位 Field
元素,除非您将命名空间管理器实例传递给 .SelectNodes()
称呼。
否则,没有节点匹配,并且您的循环永远不会进入。
但是,PowerShell 通过点符号对 XML DOM 的方便改编与名称空间无关,这使得解决方案更方便(尽管更慢):
$xml.Searchable.Fields.Field |
where id -eq 'item_transactionid' |
foreach { $_.'is-hidden-display-field' = 'true' }
另请注意属性名称 is-hidden-display-field
必须如何 引用 才能用作 PowerShell 属性 名称。
有关背景信息,请参阅 。
我有一个样本 XML 如下:
<?xml version="1.0" encoding="utf-8"?>
<Searchable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" label="$RESX('Ebr.Crdm.Store.2_0','Item','Item')" xmlns="http://sysrepublic.com/Secure/4.0/DSL/SearchService">
<Fields>
<Field data-type="System.Int64" is-editable="true" id="item_transactionid" label="$RESX('Ebr.Crdm.Store.2_0','TransactionID','Transaction ID')" is-mandatory-display-field="false" is-hidden-display-field="false" is-virtual-date-time="false" is-display-field-only="false" use-utc-datetime="true" apply-user-timezone-offset="false" show-date="true" show-time="true" is-favourite="false" common-field="true">
<FieldDescription primary-key="false" nullable="false" readonly="false" hidden="true" format="text" enable-required-validation="true" />
<Operators>
<Operator name="equal" />
<Operator name="notequal" />
<Operator name="greaterthan" />
<Operator name="greaterthanequal" />
<Operator name="lessthan" />
<Operator name="lessthanequal" />
<Operator name="between" />
<Operator name="notbetween" />
<Operator name="in" />
<Operator name="notin" />
</Operators>
<LeftExpression>
<Field data-type="System.Int64" common-field="true">
<CollectionDescription collection="pos.CRDM_Item">
<Relationship parent="pos.CRDM_Header">
<RelatedField from="TransactionID" to="TransactionID" common-to-field="true" />
<RelatedField from="TradingDay" to="TradingDay" common-to-field="true" />
</Relationship>
</CollectionDescription>
<Description>TransactionID</Description>
</Field>
</LeftExpression>
</Field>
</Fields>
</Searchable>
下面是我试过的 powershell 代码:
$xmlFile = "C:\Users\rparpani\Desktop\test2.xml"
[xml]$xml = Get-Content $xmlFile -Raw
$nodes = $xml.SelectNodes("//Field[@id = 'item_transactionid']")
foreach ($node in $nodes)
{
$node.is-hidden-display-field = 'True'
}
xml.Save('C:\Users\rparpani\Desktop\test2.xml')
似乎有不同的方法来更新布尔属性。我正在尝试将 is-hidden-display-field 从 false 更改为 true。有人可以建议我的代码有什么问题吗
您的 XML 文档使用 命名空间 ,因此您无法定位 Field
元素,除非您将命名空间管理器实例传递给 .SelectNodes()
称呼。
否则,没有节点匹配,并且您的循环永远不会进入。
但是,PowerShell 通过点符号对 XML DOM 的方便改编与名称空间无关,这使得解决方案更方便(尽管更慢):
$xml.Searchable.Fields.Field |
where id -eq 'item_transactionid' |
foreach { $_.'is-hidden-display-field' = 'true' }
另请注意属性名称 is-hidden-display-field
必须如何 引用 才能用作 PowerShell 属性 名称。
有关背景信息,请参阅