【问题标题】:Updating an xml attribute with boolean value using powershell使用 powershell 更新具有布尔值的 xml 属性
【发布时间】:2020-05-30 17:26:48
【问题描述】:

我有一个示例 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。有人可以建议我的代码有什么问题

【问题讨论】:

  • 你试过$node.is-hidden-display-field = $True
  • @shadow2020 我确实尝试过,但没有用

标签: xml windows powershell loops xml-parsing


【解决方案1】:

您的 XML 文档使用 namespaces,因此您无法定位您的 Field 元素,除非您将 namespace-manager 实例传递给 .SelectNodes() 调用。 没有它,没有节点匹配,并且您的循环永远不会进入。

然而,PowerShell 通过点表示法对 XML DOM 的便捷适应是与命名空间无关的,这可以实现更方便(尽管速度较慢)的解决方案:

$xml.Searchable.Fields.Field | 
  where id -eq 'item_transactionid' |
   foreach { $_.'is-hidden-display-field' = 'true' }

还要注意属性名称 is-hidden-display-field 必须引用才能用作 PowerShell 属性名称。

有关背景信息,请参阅this answer。

【讨论】:

  • 现在,如果我想更改附加到同一 ID 的字段描述的隐藏属性怎么办?
  • @RajParpani:然后你在foreach 脚​​本块中使用$_.FieldDescription.hidden = 'true'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2020-08-21
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2015-01-01
  • 2014-09-01
相关资源
最近更新 更多