【问题标题】:Edit .XML file with Powershell, encoding使用 Powershell 编辑 .XML 文件,编码
【发布时间】:2013-11-20 17:00:00
【问题描述】:

我需要用 powershell 编辑一个 .xml 文件。我需要做的是从服务器下载 .xml 文件,更新版本号,然后将其保存在我的本地计算机中。这就是我所做的。

[xml]$myXML = get-content $xmlFileServer
$myXML.'ivy-module'.info.revision = $newVersion
$myXML.Save($newXMLFileName)

然后我将在我的本地计算机中有一个新的 xml 文件。但是,我怀疑编码是否不同,因为我无法使用此 .xml 文件进行处理。 我应该得到的 .xml 是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd" xmlns:e="http://ant.apache.org/ivy/extra">
  <info organisation="XXXX" module="XXXX" revision="2.0.1.0" status="release" publication="20131119202217" />
  <publications>
    <artifact name="XXXX" type="dll" ext="zip" conf="*" />
  </publications>
</ivy-module>

但是,使用 powershell 编辑后,.xml 包含一些隐藏信息。我试图用 NotePad++ 打开,我得到了这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd" xmlns:e="http://ant.apache.org/ivy/extra">
  <info organisation="XXXX" module="XXXX" revision="2.0.1.0" status="release" publication="20131119202217"/>
  <publications>
    <artifact name="XXXX" type="dll" ext="zip" conf="*"/>
  </publications>
</ivy-module>

谁能告诉我为什么会这样? 非常感谢。

【问题讨论】:

    标签: xml powershell


    【解决方案1】:

    这对我有用,基于上面的链接和this blog post

    $enc = New-Object System.Text.UTF8Encoding( $false )
    $wrt = New-Object System.XML.XMLTextWriter( 'c:\path\out.xml', $enc )
    $wrt.Formatting = 'Indented'
    $myXML.Save( $wrt )
    $wrt.Close()
    

    “缩进”设置是个人喜好;我更喜欢我的 XML 可读性。 $wrt.Close() 也是必需的。

    【讨论】:

    • 注意:这对我有用;但要让文本编辑器识别出文件是UTF-8 而不是ANSI,我不得不在UTF8Encoding 的构造函数中使用$true 作为encoderShouldEmitUTF8Identifier 参数。
    • 这在 PowerShell 5.1 中对我不起作用。我得到“为 'Save' 和参数计数 '1' 找到多个模棱两可的重载。”
    • 唯一对我有用的是使用 StreamWriter:stackoverflow.com/a/30266424
    【解决方案2】:

    不是使用get-content读取xml,而是直接使用XmlDocument读取xml:

    功能测试($path) {

    $xDoc = New-Object System.Xml.XmlDocument
    $file = Resolve-Path($path)
    
    $xDoc.Load($file)
    $xDoc.Save($file) #will save correctly
    

    }

    【讨论】:

    • 如果 XML 文件尚未包含 BOM,$xDoc.Load($file) 不起作用 - 它实际上会引发异常,抱怨缺少 BOM。
    【解决方案3】:

    "" 是 UTF-8 的 Byte Order Mark。这里有一个没有 BOM 的 UTF-8 文件的解决方案: Using PowerShell to write a file in UTF-8 without the BOM

    【讨论】:

    • 谢谢。这行得通。我只需要添加一行代码。谢谢。
    • 您能否扩展答案以显示如何将链接的解决方案与 XML 文件合并? [System.IO.File]::WriteAllLines($MyPath, $myXML, $Utf8NoBomEncoding) 只是打印出“System.Xml.XmlDocument”。我宁愿不必用 $myXML.Save() 编写一次,然后再次重新读取它以在没有 BOM 的情况下保存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2011-08-28
    • 2014-09-12
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多