xml - 如何将 .xml 读入内存并写出相同的结果

标签 xml powershell tivoli-work-scheduler

我正在尝试读取 .xml 文件,更改一些值(尚未),然后将其写回。在不做任何改变的情况下,我希望得到和进去的一样的东西。它没有。

PS H:\src\tws> type .\test000.xml
<?xml version="1.0"?>
<eventRuleSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns="http://www.ibm.com/xmlns/prod/tws/1.0/event-management/rules"
              xsi:schemaLocation="http://www.ibm.com/xmlns/prod/tws/1.0/event-management/rules http://www.ibm.com/xmlns/prod/tws/1.0/event-management/rules/EventRules.xsd">
    <eventRule name="PW-TEST001" ruleType="filter" isDraft="no">
        <description>Paul's test001</description>
    </eventRule>
</eventRuleSet>

这是我用来读入和写出的简单代码。
PS H:\src\tws> Get-Content .\con000.ps1
$x = [xml](Get-Content -Path .\test000.xml)
$x | Export-Clixml -Path .\con000.xml -Encoding utf8

输出有 和 部分。这是为什么?我想知道里面的内容。我不关心换行符或 HTML 实体的使用。我只想让内容成为精髓。是的,计划是读取一个模板,更改一些值,然后输出一个新的 .xml 文件。这将输入到 IBM/HCS Workload Scheduler。
PS H:\src\tws> type .\con000.xml
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
  <XD>&lt;?xml version="1.0"?&gt;&lt;eventRuleSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.ibm.com/xmlns/prod/tws/1.0/event-management/rules" x
si:schemaLocation="http://www.ibm.com/xmlns/prod/tws/1.0/event-management/rules http://www.ibm.com/xmlns/prod/tws/1.0/event-management/rules/EventRules.xsd"&gt;&lt;eventRule
name="PW-TEST001" ruleType="filter" isDraft="no"&gt;&lt;description&gt;Paul's test001&lt;/description&gt;&lt;/eventRule&gt;&lt;/eventRuleSet&gt;</XD>
</Objs>

最佳答案

  • Export-CliXml 的目的|是通过 Import-CliXml 序列化任意对象以供以后反序列化,使用关于保留特定输入类型以供以后通过 Import-CliXml “补水”的尽力而为的表示.
  • 它的目的不是写任意[xml]的文本表示文件到一个文件。

  • 为了保存 [xml] 的文本表示实例到一个文件,你有两个基本的选择:
  • 如果 XML 文档的文本表示的特定格式不是问题 ,只需调用.OuterXml在(修改)[xml]实例并将其发送到文件 - 通过 Set-Content或通过Out-File/> ,但请注意这些 cmdlet 在 Windows PowerShell 中应用的不同默认字符编码。
  • 使用 .NET 框架 , 如果你想要 打印精美的文字表示输出文件中的 XML:
  • [xml] type's .Save() method保存到文件时可以方便地执行隐式 pretty-print ,但存在以下缺陷:
  • 由于 .NET 通常对当前目录有不同的想法,因此请务必传递完整的文件路径。
  • 在没有带有 encoding 的 XML 声明的情况下属性,该方法创建一个没有 BOM 的 UTF-8 文件(从跨平台的角度来看这是更可取的)。
  • 相反,奇怪的是,如果一个带有 encoding="UTF-8" 的 XML 声明存在,从 .NET Core 2.1/.NET v4.7 开始,生成的文件将是带有 BOM 的 UTF-8;见 this GitHub issue .
  • 使用 [System.Xml.XmlWriter] 具有显式创建的文件流对象的实例,这更麻烦,但可以让您控制 pretty-print 格式的细节。


  • 这是一个简单的例子,.OuterXml :
    # Read the input file into an XML document (in-memory DOM).
    $x = [xml] (Get-Content -Raw ./test000.xml)
    
    # Make updates to the in-memory document
    $x.eventRuleSet.eventRule.description = 'new description'
    
    # Save the modified document as text to an output file,
    # using the un-prettied textual representation provided by the .OuterXml
    # property.
    # If *BOM-less* UTF-8 encoding is what you want, simply use
    #   $x.Save("$PWD/con000.xml")
    # In PowerShell *Core*, you'd get BOM-less UTF-8 even with the command below.
    $x.OuterXml | Set-Content -Encoding utf8 ./con000.xml
    

    关于使用 BOM 的说明(又名 Unicode 签名)与 UTF-8和其他 Unicode 编码:
  • 在 Windows PowerShell 中,-Encoding utf8总是创建一个 BOM(不仅适用于 Set-Content,还适用于其他产生文件输出的 cmdlet,例如 Out-FileExport-Csv)。
  • 需要直接使用 .NET 框架来创建无 BOM 的 UTF-8 文件(对于 PowerShell 友好的包装函数,请参阅我的 this answer)。请注意,.NET 框架的默认编码一直是无 BOM 的 UTF-8。
  • PowerShell Core 默认创建无 BOM 的 UTF-8 文件(以及当您明确使用 -Encoding utf8 时);您可以选择使用 -Encoding utf8BOM 创建 BOM .

  • 为了获得最佳的整体兼容性,应避免使用 UTF-8 文件中的 BOM:Unix 平台和 Windows 平台上也使用的 Unix-heritage 实用程序通常不知道如何处理它们。

    同样,-Encoding UTF7应该避免,因为它不是标准的 Unicode 编码(并且在两个 PowerShell 版本中都没有 BOM 编写)。

    在两个 PowerShell 版本中,-Encoding 提供的所有其他 Unicode 编码创建一个(适合编码的)BOM:Unicode (UTF-16LE), bigendianunicode (UTF-16BE) 和 utf32 (UTF-32)。

    关于xml - 如何将 .xml 读入内存并写出相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53000457/

    相关文章:

    java - 是否有使用编码/解码的替代方法?

    google-chrome - 通过Powershell启动过程在新标签页而不是新窗口中打开Chrome

    java - 计划中的 TWSz Java API 重启和 restartAndCleanUp 作业

    linux - 由于缺少 Workload Scheduler 的先决条件,Tivoli Common Reporting 安装在 Linux 上失败

    powershell - msbuild 在 Windows 7 下调用 powershell 脚本出现签名错误

    java - IBM TWS Java API 查询过滤器

    python - ElementTree 和 Element 有什么区别? ( python XML)

    ios - EWS GetStreamingEvents。仅通过超时收到响应

    c# - 使用 C# 处理 xml 文件的最简单方法是什么?

    c# - 如何在 Visual Studio 中从 C# 调用 PowerShell cmdlet