powershell中的Save()正在损坏xml文件

powershell中的Save()正在损坏xml文件,xml,powershell,Xml,Powershell,我有一个简单的xml文件,当使用get内容并将xml文件保存回来时。它会破坏xml文件并变得不可用。欢迎您的帮助/建议/解决方案 $xmlfile = 'C:\Test\stack.xml' [xml]$xmlcontent = (Get-Content $xmlfile) $xmlcontent.Save($xmlfile) 下面是我的示例xml文件,我在这里使用它来运行上面提到的powershell脚本。您可以将下面的xml保存到文件中以供参考 <?xml version="1.0"

我有一个简单的xml文件,当使用get内容并将xml文件保存回来时。它会破坏xml文件并变得不可用。欢迎您的帮助/建议/解决方案

$xmlfile = 'C:\Test\stack.xml'
[xml]$xmlcontent = (Get-Content $xmlfile)
$xmlcontent.Save($xmlfile)
下面是我的示例xml文件,我在这里使用它来运行上面提到的powershell脚本。您可以将下面的xml保存到文件中以供参考

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE fccconfig SYSTEM "fccconfig.dtd">

<fccconfig version="1.2.3">
   <fccdefaults>

      <!-- general -->
      <property name="FCC_CacheLocation" value="C:/Users/Public/sometestCache" overridable="true"/>
      <property name="FCC_LogFile" value="C:/Users/Public/sometestfile.log" overridable="true" />
      <!-- external site access definition -->
      <!-- <site id="013B998A65427E" overridable="true"> -->
         <!-- <parentfsc address="localhost:4567" priority="0"/> -->
         <!-- <parentfsc address="myserverhost:4444" priority="1"/> -->
         <!-- <assignment mode="parentfsc" /> -->
      <!-- </site> -->

      <site id="-987654321" overridable="true">
         <parentfsc address="http://testlink:12345/" priority="0" />
      </site>
      <!--__ANT_MARK__-->

   </fccdefaults>

   <!-- default parentfsc - this is a marker that will be overwritten by the installer -->
   <parentfsc address="address1.com:2020" priority="0" transport="lan"/>
   <parentfsc address="address1.com:2020" priority="1" transport="lan"/>

</fccconfig>


文字总是比图片好。第2行中添加的方括号似乎是一个普通的xml内容:

请注意,文件将与第1行的编码一起保存。在这种情况下,如果utf8 bom不存在,则会添加该bom


可能会阻止重新格式化吗

文本总是比图片好。第2行中添加的方括号似乎是一个普通的xml内容:

请注意,文件将与第1行的编码一起保存。在这种情况下,如果utf8 bom不存在,则会添加该bom

可能会阻止重新格式化吗

它正在破坏xml文件并变得不可用

没有损坏-该文件仍然可以被XML处理器读取,并且具有相同的内容,但由于类中内置的(默认)行为(可通过PowerShell中的类型加速器
[XML]
访问),其格式方面发生了更改:

  • (a) 读取时,输入XML文本中不重要的空白被修剪,保存时,元素被漂亮地打印出来(通过缩进自动分布在多行中);因此,文档的视觉结构发生了变化(但内容没有变化)

  • (b)
    []
    被附加到(
    )的末尾,以表示一个空的内部子集,当文档保存到文件时,显然总是添加该子集-同样,从XML解析的角度来看,内容没有变化

  • (c) 保存的文件使用带有BOM的字符编码UTF-8-无论输入文件是否有BOM;原因是XML声明中的
    encoding=“UTF-8”
    属性(不幸的是)导致
    .Save()
    方法使用BOM;虽然它是多余的,但对任何XML解析器来说都不会造成问题

    • 不幸的是,为了向后兼容,这种冗余行为不会改变-请参阅
寻址(a)-保留原始视觉结构-相当简单:

$xmlfile = 'C:\Test\stack.xml'

# Create an empty XmlDocument instance...
$xmlcontent = [xml]::new()
# ... and tell it to preserve non-significant whitespace when 
#     reading from / writing to a file.
$xmlcontent.PreserveWhitespace = $true

# Load the XML text from the file.
$xmlContent.Load($xmlFile)

# ...

# Save it back to the file, with the original whitespace preserved.
$xmlcontent.Save($xmlfile)
注意:上面使用的是完整的文件路径,但在向.NET方法传递路径时始终使用完整的文件路径很重要,因为.NET的工作目录通常与PowerShell的不同


如果您确实需要同时解决(b)和(c),请在上述步骤之后运行以下步骤:

[IO.File]::WriteAllText(
  $xmlfile,
  ((Get-Content -Raw $xmlfile) -replace '(?m)(?<=^<!DOCTYPE .+)\[\](?=>)')
)
[IO.File]::WriteAllText(
$xmlfile,
((获取内容-原始$xmlfile)-替换“(?m)(?)?
它正在破坏xml文件并变得不可用

没有损坏-该文件仍然可以被XML处理器读取,并且具有相同的内容,但由于类中内置的(默认)行为(可通过PowerShell中的类型加速器
[XML]
访问),其格式方面发生了更改:

  • (a) 输入XML文本中不重要的空白在读取时被修剪,在保存时元素被打印出来(通过缩进自动分布在多行中);因此,文档的视觉结构发生了变化(但内容没有变化)

  • (b)
    []
    被附加到(
    )的末尾,以表示一个空的内部子集,当文档保存到文件时,显然总是添加该子集-同样,从XML解析的角度来看,内容没有变化

  • (c) 保存的文件将字符编码UTF-8与BOM一起使用-无论输入文件是否有BOM;原因是XML声明中的
    encoding=“UTF-8”
    属性(不幸的是)导致
    .Save()
    方法使用BOM;虽然它是多余的,但对任何XML解析器都不会造成问题

    • 不幸的是,为了向后兼容,这种冗余行为不会改变-请参阅
寻址(a)-保留原始视觉结构-相当简单:

$xmlfile = 'C:\Test\stack.xml'

# Create an empty XmlDocument instance...
$xmlcontent = [xml]::new()
# ... and tell it to preserve non-significant whitespace when 
#     reading from / writing to a file.
$xmlcontent.PreserveWhitespace = $true

# Load the XML text from the file.
$xmlContent.Load($xmlFile)

# ...

# Save it back to the file, with the original whitespace preserved.
$xmlcontent.Save($xmlfile)
注意:上面使用的是完整的文件路径,但在向.NET方法传递路径时始终使用完整的文件路径很重要,因为.NET的工作目录通常与PowerShell的不同


如果您确实需要同时解决(b)和(c),请在上述步骤之后运行以下步骤:

[IO.File]::WriteAllText(
  $xmlfile,
  ((Get-Content -Raw $xmlfile) -replace '(?m)(?<=^<!DOCTYPE .+)\[\](?=>)')
)
[IO.File]::WriteAllText(
$xmlfile,

((Get Content-Raw$xmlfile)-replace'(?m)(?Hi@js2010抱歉,我不理解您试图解释的内容。我是powershell的新手。我还检查了该链接,我认为这已在C#中执行。我目前正在powershell中执行保存操作。在我的情况下,我希望避免[]xml文件中的大括号,如果您检查,缩进也已完全更改。在我看来,我不认为您可以避免重新缩进。从某种意义上说,保存使缩进变得“漂亮”。我不知道如何去掉括号。我想把它留在里面就可以了。嗨@js2010对不起,我不明白你想解释什么。我是powershell的新手。我还检查了该链接,我想这已经在C#中执行了。我目前正在powershell中执行保存操作。在我的情况下,我希望避免XML文件中的[]括号,如果你检查的话,缩进也会发生同样的变化。在我想避免的情况下,我认为你不能避免重新缩进。从某种意义上说,保存使它“漂亮”。我不知道如何去掉括号。我想把它放进去就好了。请考虑。