【问题标题】:Replace text in xml file via Powershell通过 Powershell 替换 xml 文件中的文本
【发布时间】:2021-08-14 21:56:47
【问题描述】:

我有一个 XML 文件。我需要将语言替换为瑞典语。

 <?xml version="1.0" encoding="utf-8"?>
    <usersettings>
      <Language type="string">English</Language>
    </usersettings>

你能帮帮我吗?

$xmldata = [xml] (Get-Content $file)
$xmldata.usersettings.Language.'#text'

【问题讨论】:

    标签: xml powershell replace


    【解决方案1】:

    将新值分配给所需节点的InnerText 属性:

    $xmldata.usersettings.Language.InnerText = 'Swedish'
    
    # remember to save updated document to disk
    $xmldata.Save((Resolve-Path $file).Path)
    

    【讨论】:

      【解决方案2】:

      补充Mathias R. Jessen's有用的答案:

      您自己的方法也会奏效 - 尽管它 (a) 有点模糊,并且 (b) 依赖于目标元素已经包含文本(在您的情况下是正确的):

      $xmldata.usersettings.Language.'#text' = 'Swedish'
      

      PowerShell's adaptation of the XML DOM(将子元素和属性显示为属性)很方便,但记住精确的规则可能会很棘手:

      • 如果给定元素only没有内容或只有文本内容(文本子节点)并且也没有属性,它在其父元素上显示为 字符串值 属性。

        • 你可以直接给这样一个属性赋值一个字符串来设置它的文本内容;例如:

          $xml = [xml] '<usersettings><Language>English</Language></usersettings>'
          $xml.usersettings.Language = 'Swedish'
          $xml.OuterXml # output the XML for verification
          
      • 相比之下,如果一个元素具有属性和/或子元素,它会显示为XmlElement-valued 属性。

        • 子文本节点(如果有)表示为调整属性.'#text'(需要引用),以及表示属性和子元素的调整属性(如果有)。

          $xml = [xml] '<usersettings><Language type="String">English</Language></usersettings>'
          # Due to presence of an *attribute*, assignment must now happen
          # via a property.
          # Property '#text' is the existing text child node (text content).
          $xml.usersettings.Language.'#text' = 'Swedish'
          $xml.OuterXml # output the XML for verification
          
        • 独立地,您可以使用 type-native .InnerText 属性将元素的当前子节点(如果有)替换为文本节点,如 Mathias 的回答中所示。

          $xml = [xml] '<usersettings><Language type="String">English</Language></usersettings>'
          # Due to presence of an *attribute*, assignment must now happen
          # via a property.
          # Property .InnerText replaces all child nodes, if any, with 
          # a child text node (text content).
          $xml.usersettings.Language.InnerText = 'Swedish'
          $xml.OuterXml # output the XML for verification
          

      简而言之:

      • 当使用 PowerShell 对 XML DOM 的基于属性的适配时,您需要注意 XML 元素何时变为 [string] 类型的属性 - 您可以直接将字符串分配给该属性 - 与何时变为 @ 987654332@-typed 属性 - 需要使用另一个属性来分配文本内容。

      • 其他属性可以是.'#text',如果存在现有文本内容(文本子节点)或 - 独立于任何现有子节点 - .InnerText,但请注意后者悄悄地替换任何现有的子节点,包括 element 子节点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-24
        • 2016-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多