如何使用Powershell从以下XML获取assignee标记的值

如何使用Powershell从以下XML获取assignee标记的值,xml,powershell,selectnodes,Xml,Powershell,Selectnodes,XML: 输出为空(null) 如何获取受让人id(John Doe)的值 我也试过以下方法,都不返回任何结果 $singleAssignee = $MyXML.SelectNodes('//work-item/field[@id="assignee"]') write ("`t" + $singleAssignee.InnerText) @SteveGray说,一旦我修复了XML,代码就可以为我工作了。在您的示例中,最后一个元素没有使用标记关闭。如果该错误也存在于实际的XML中,并且在分配

XML:

输出为空(null)

如何获取受让人id(John Doe)的值

我也试过以下方法,都不返回任何结果

$singleAssignee  = $MyXML.SelectNodes('//work-item/field[@id="assignee"]')
write ("`t" + $singleAssignee.InnerText)

@SteveGray说,一旦我修复了XML,代码就可以为我工作了。在您的示例中,最后一个
元素没有使用
标记关闭。如果该错误也存在于实际的XML中,并且在分配$MyXML时没有捕捉到错误,那么这可能就是实际问题所在? 另外,您使用的是SelectNodes,因此
$singleAssignee
可能不是那么单一。这可能会让你更靠近一点

#$singleAssignee  = $MyXML.work-item.field.assignee
#$singleAssignee  = Select-XML -xml $MyXML -xpath "//work-item/field/@assignee"        

您是否将
$MyXml
声明为类型
[xml]
? 如果是,则
$singleassignment.InnerText
$singleassignment.\text'
将为您提供字段“John Doe”的值:

$assignees  = $MyXML.SelectNodes('//work-item/field[@id="assignee"]')
foreach ($assignee in $assignees) {
    write ("`t$($assignee.InnerText)")
}
#使用xml作为此处字符串
[xml]$MyXml=@”
无名氏
管理
2019-06-05 10:03:38.763 -0400
"@
#或者,如果xml位于文件中,则使用
#[xml]$MyXml=Get Content-Path'D:\test.xml'-raw#''
$singleAssignee=$MyXML.SelectNodes(“//工作项/字段[@id=“assignee”]”)
$SingleAssignment.#文本'

对不起,我遗漏了很多XML。该字段在我的文件中已正确关闭。我添加了foreach,它可以正常工作。我猜这意味着selectNodes返回一个列表,无论列表中有多少元素,您都必须遍历该列表。是的,使用selectNodes可以获得一个数组,可能只有一个项目。数组在.InnerText属性中没有任何内容,但由于PowerShell的工作方式,它也不会在那里抛出错误。这和被污染的管道问题确实很难追踪。是的,我没有包括整个Powershell脚本,我尝试了InnerText和“#text”。当我将write语句放入foreach循环时,一切都按预期进行。
$assignees  = $MyXML.SelectNodes('//work-item/field[@id="assignee"]')
foreach ($assignee in $assignees) {
    write ("`t$($assignee.InnerText)")
}
# using the xml as here-string
[xml]$MyXml = @"
<?xml version="1.0" encoding="UTF-8"?>
<work-item>
    <field id="assignee">John Doe</field>
    <field id="author">admin</field>
    <field id="created">2019-06-05 10:03:38.763 -0400</field>
    <field id="description" text-type="text/plain"></field>
</work-item>
"@

# or if the xml is in a file, use 
# [xml]$MyXml = Get-Content -Path 'D:\test.xml' -raw # '<THE XML FILE>'

$singleAssignee  = $MyXML.SelectNodes('//work-item/field[@id="assignee"]')
$singleAssignee.'#text'