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

时间:2018-10-26 02:06:40

标签: 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>

2 个答案:

答案 0 :(得分:1)

  • Export-CliXml的目的是使用尽力而为表示,通过Import-CliXml 序列化任意对象,以便以后通过[xml]进行反序列化。关于保留特定输入类型以供以后通过Import-CliXml进行“补液”。

  • 不是的目的是将任意.OuterXml文档的文本表示写入文件。

要将[xml]实例的文本表示形式保存到文件中,您有两个基本选择:

  • 如果不关心XML文档的文本表示形式的特定格式,只需在经过修改的[xml]实例上调用Set-Content并发送通过Out-File或通过> / encoding将其保存到文件中,但请注意Windows PowerShell中这些cmdlet应用的不同默认字符编码。

  • 如果要在输出文件中XML的漂亮印刷的文本表示形式,请使用 .NET框架

    • [xml] type's .Save() method在保存到文件时可以方便地执行隐式漂亮打印,但是存在一些缺陷:

      • 由于.NET通常对当前目录的含义有所不同,因此请确保传递完整文件路径

      • 在没有带有encoding="UTF-8"属性的XML声明的情况下,该方法会创建一个没有BOM的UTF-8文件 (从跨平台的角度来看这是首选)

      • 奇怪的是,如果存在带有.OuterXml 的XML声明,则生成的文件将是带有BOM表的UTF-8 ,从.NET Core 2.1 / .NET v4.7开始;参见this GitHub issue

    • [System.Xml.XmlWriter]实例与显式创建的文件流对象一起使用,这虽然比较麻烦,但可以控制漂亮打印格式的细节。


这是一个# 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 的简单示例:

-Encoding utf8

关于使用BOM和其他Unicode编码的UTF-8(又称Unicode签名)的说明:

  • Windows PowerShell 中,Set-Content 总是创建BOM(不仅适用于Out-File,而且还适用于其他cmdlet)产生文件输出,例如Export-Csv-Encoding utf8)。

    • 需要直接使用.NET框架来创建BOM- less UTF-8文件(有关PowerShell友好的包装函数,请参阅我的this answer)。请注意,.NET框架的默认编码始终为无BOM的UTF-8。
  • PowerShell Core 默认情况下会创建BOM- less UTF-8文件 (以及明确使用
    时) -Encoding utf8BOM);您可以选择使用-Encoding UTF7创建BOM。

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

类似地,应避免使用-Encoding,因为它不是标准的Unicode编码(并且在两个PowerShell版本中都是 而不是BOM编写的。)

两个 PowerShell版本中,Unicode do 可用的所有其他Unicode编码都会创建(适当的编码)BOM:bigendianunicode(UTF -16LE),utf32(UTF-16BE)和{{1}}(UTF-32)。

答案 1 :(得分:0)

在调试器中试用此代码。

rnn_output, rnn_states = tf.nn.dynamic_rnn(encoder_cell, X, dtype=tf.float32)