2013-07-19 1 views
0

Я пытаюсь создать сценарий Powershell, который просто рекурсирует через каталог, вытаскивая XML-файлы. Затем мы просматриваем каждый из XML-файлов, и я просто хочу вернуть счетчик определенного узла. Прямо вперед. Однако я не могу заставить его работать, и он не загружает дочерние узлы правильно.Почему Powershell не обрабатывает мой файл как хорошо сформированный XML-документ?

Вот мой код:

foreach ($file in $xmlFiles) 
{  
$xml = [xml](Get-Content $file) 
$xml.SelectNodes("//RootNode/NextNode") 
Write-Host $xml.count  
} 

Проблема, на мой взгляд, не лежит с кодом, но, возможно, XML-файла. Если я делаю $ xml.ChildNodes я получаю:

xmlns      NextNode 
_____      _____ 
http://urlgoeshere   NextNode 

, где первый элемент является атрибутом корневого узла, в частности, информация о схеме; второй элемент - следующий узел вниз от корня. Однако есть больше узлов, которые не будут отображаться. XML хорошо сформирован, поскольку он генерируется одной программой и используется другим. Однако ChildNodes просто не отображает все узлы.

<ScreeningSubmission xmlns="http://schema/"> 
<submission version="2.0">  
<patient> 
    <firstname></firstname> 
    <lastname></lastname> 
    <gender></gender> 
    <date-of-birth></date-of-birth> 
    <ethnicity></ethnicity> 
    <client_ref></client_ref> 
    <address1></address1> 
    <address2></address2> 
    <address3></address3> 
    <postcode> </postcode> 
    <telephone></telephone> 
    <events> 
    <result> 
     <date></date> 
     <read2></read2> 
     <value></value> 
     <units></units> 
     <term30></term30> 
     <term60></term60> 
    </result>   
    </events> 
</patient> 
</submission> 
</ScreeningSubmission> 

По сути, я хочу подсчитать количество узлов - в общем случае около 10+ этого узла.

+0

Не могли бы вы опубликовать сам XML? – stej

+0

да, у меня будет баш, чтобы его санировать и выталкивать. – kafka

ответ

1

Вы можете забыть о XPath, если это не является необходимым и использовать прямой доступ:

$xml = [xml](Get-Content $file) 
$xml.ScreeningSubmission.submission.patient.ChildNodes.Count 
+0

Бинго, это все, спасибо :) – kafka

0

Вы должны назначить результат SelectNodes в переменную. Вы получите список, чтобы затем записать число элементов, используя count.

$nodes = $xml.SelectNodes("//RootNode/NextNode") 
Write-Host $nodes.count 

Вы можете также запросить для узлов рассчитывать, используя следующее заявление

$xml.ScreeningSubmission.ChildNodes.Count 
+0

Это хороший момент, однако я сделал это и теперь получаю 0 для каждого файла. Я знаю, что существует> 0 узлов. – kafka

0

Проверьте, если ваше определение схемы верно. Это сработало для меня, когда я удалил его.

+0

Я положил здесь фиктивный URL-адрес - предположительно, если он хорошо сформирован, на самом деле не имеет значения, что это такое? – kafka

Смежные вопросы