当前,我必须将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)
答案 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"})
中指定的-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。 没有变更日志节点。