При работе с объектами XML в Powershell должны ли HasChildNodes возвращать значение true, если элемент имеет только текстовые данные, а не другой элемент?Разве нет способа идентифицировать элементы, у которых нет каких-либо реальных элементов под ними?
Учитывая приведенный ниже пример, я надеялся, что элемент Parameter_Section вернет true для наличия детей, но я не ожидал бы, что элементы внутритакже вернуть true, если у них были данные.Например, SCM_Included, SendToApp и WF_Start все возвращают true, потому что у них есть текст.Определение гласит «Получает значение, указывающее, имеет ли этот узел какие-либо дочерние узлы».Означает ли это, что текст или данные считаются дочерними узлами?
Я анализирую несколько файлов InfoPath XML и надеюсь, что смогу игнорировать родительские элементы, такие как Parameter_Section, которые служат только для организации (вызовы InfoPathэто «разделы») дочерние элементы, которые на самом деле хранят данные (которые являются полями в InfoPath).
function ReadAllNodes ($node) {
foreach ($childnode in $node.ChildNodes)
{
[string] $path = Get-XPath($childnode)
[string] $nt = $childnode.NodeType
[string] $hc = $childnode.HasChildNodes
[string] $name = $childnode.Name
[string] $val = $childnode.Value
[string] $txt = $childnode.'#text'
Write-Host (“Name={0}, path={1}, type={2}, hc={3}, val={4}, txt={5}” -f $name, $path, $nt, $hc,$val,$txt)
}
foreach ($cn in $childnode) {
ReadAllNodes $cn
}
}
$Xml = @"
<?xml version="1.0" encoding="utf-8"?>
<myFields>
<Parameter_Section>
<Approval_Mode />
<SCM_Included>n</SCM_Included>
<ApprovalCompleteDateTime />
<ApprovalCompleteDateStr />
<SendToApp>No</SendToApp>
<WF_Start>0</WF_Start>
<QuoteAttachCount>0</QuoteAttachCount>
<TestEmail />
<TestMessage />
<IsCurrentUserRequestor>true</IsCurrentUserRequestor>
<CanCurrentUserApprove>Approve</CanCurrentUserApprove>
</Parameter_Section>
</myFields>
"@
$content = New-Object -TypeName XML
$content.LoadXml($Xml)
[System.Xml.XmlElement] $root = $content.get_DocumentElement()
ReadAllNodes $root
Name=Parameter_Section, path=/myFields/Parameter_Section, type=Element, hc=True, val=, txt=
Name=Approval_Mode, path=/myFields/Parameter_Section/Approval_Mode, type=Element, hc=False, val=, txt=
Name=SCM_Included, path=/myFields/Parameter_Section/SCM_Included, type=Element, hc=True, val=, txt=n
Name=ApprovalCompleteDateTime, path=/myFields/Parameter_Section/ApprovalCompleteDateTime, type=Element, hc=False, val=, txt=
Name=ApprovalCompleteDateStr, path=/myFields/Parameter_Section/ApprovalCompleteDateStr, type=Element, hc=False, val=, txt=
Name=SendToApp, path=/myFields/Parameter_Section/SendToApp, type=Element, hc=True, val=, txt=No
Name=WF_Start, path=/myFields/Parameter_Section/WF_Start, type=Element, hc=True, val=, txt=0
Name=QuoteAttachCount, path=/myFields/Parameter_Section/QuoteAttachCount, type=Element, hc=True, val=, txt=0
Name=TestEmail, path=/myFields/Parameter_Section/TestEmail, type=Element, hc=False, val=, txt=
Name=TestMessage, path=/myFields/Parameter_Section/TestMessage, type=Element, hc=False, val=, txt=
Name=IsCurrentUserRequestor, path=/myFields/Parameter_Section/IsCurrentUserRequestor, type=Element, hc=True, val=, txt=true
Name=CanCurrentUserApprove, path=/myFields/Parameter_Section/CanCurrentUserApprove, type=Element, hc=True, val=, txt=Approve
Name=#text, path=/myFields/Parameter_Section/CanCurrentUserApprove/#text, type=Text, hc=False, val=Approve, txt=