PowerShell脚本读取Xml文件并仍然抛出异常

时间:2019-06-27 16:49:28

标签: xml powershell

当前,我必须将XML文件从XML版本1.1更改为1.0,以便能够读取该文件。这样做之后,我能够读取XML文件并将所需的信息从文件中提取出来。但是,这样做导致PowerShell引发以下异常。

  

-无法将值“ System.Object []”转换为类型   “ System.Xml.XmlDocument”。错误:“'<'字符,十六进制值   0x3C,不能包含在名称中。 132行,位置61。”

     

-您不能在空值表达式上调用方法。

这是我的代码:

$xmlfile = [xml](gc "C:\Temp\build.xml" | ForEach-Object{$_ -replace "1.1-*", "1.0"}) 

$name = $xmlfile .SelectSingleNode("//name").'#text'  
$result = $xmlfile .SelectSingleNode("//result").'#text' 
$status = $xmlfile .SelectSingleNode("//status").'#text'
$workspace = $xmlfile.SelectSingleNode("//changelog").'#text' 
$id = $workspace.Split("\")[3]  

[PSCustomObject]@{
    "Name" = $name
    "Result" = $result
    "Status " = $status 
    "Id" = $id
}

我尝试了不同的方式来加载XML文件,以包括与此类似的内容:

[System.Xml.XmlDocument]$file = New-Object System.Xml.XmlDocument
$file.Load($fullpath)

3 个答案:

答案 0 :(得分:2)

我无法重现前两个错误。

作为C#开发人员,我可以告诉你,第一个错误是由ForEach-Object引起的,因为它返回了Object[]个字符串对象(它当然不知道它们是字符串),并试图由于XmlDocument将它们转换为[xml],但是System.Object[]无法转换为XmlDocument,因此会引发错误。您需要将Object[]转换为XmlNode[],然后转换为XmlDocument对象,以便进一步解析。更改后,可以使用Select-Xml -Content来完成。

$xmlfile = Select-Xml -Content (gc "C:\Temp\build.xml" | ForEach-Object{$_ -replace "1.1-*","1.0"})

由于String[] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-xml?view=powershell-6#parameters

中指定的-Content,这很可能起作用

编辑:如果XML格式不正确或已损坏,则将引发类似错误

答案 1 :(得分:2)

$xmlfile = [xml]( ( Get-Content "C:\Temp\build.xml" ) -replace "xml\sversion='1\.1'", "xml version='1.0'" ) 

说明:

  • 不要把ForEach-Object当作run the programm elevated
  • 正则表达式扩展到"xml\sversion='1\.1'",以保持其他'1.1'的值不变(如果输入文件中有)。

运行改进的代码将提供以下输出:

Name       Result  Status Id  
----       ------  ------ --  
env_webdep SUCCESS ERROR  test

顺便说一句,(只能猜测)您可能会对使用

有兴趣
$id = $workspace.Split("\")[-1]

$id = $workspace | Split-Path -Leaf

代替

$id = $workspace.Split("\")[3]

答案 2 :(得分:0)

这是我得到的错误:

  

无法将值“ System.Object []”转换为类型   “ System.Xml.XmlDocument”。错误:“第28行的'value'开始标记   位置12与的结束标记不匹配   'hudson.model.StringParameterValue'。第29行,位置11。“

第28行缺少“ <”。 缺少“ <”行62。 没有变更日志节点。