powershell中的Save()正在损坏xml文件
我有一个简单的xml文件,当使用get内容并将xml文件保存回来时。它会破坏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"
$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文件中的[]括号,如果你检查的话,缩进也会发生同样的变化。在我想避免的情况下,我认为你不能避免重新缩进。从某种意义上说,保存使它“漂亮”。我不知道如何去掉括号。我想把它放进去就好了。请考虑。