Синтаксический анализ XML с помощью Powershell

#xml #powershell #parsing

#xml #powershell #синтаксический анализ

Вопрос:

Я не хочу получать все идентификаторы этого xml (xml не может быть изменен)

 <?xml version="1.0" encoding="ISO-8859-1"?>
<List>
 <Person1>
    <Id>E00023</Id>
    <empName>Aadharsh</empName> 
 </Person1>
 <Person2>
    <Id>E00042</Id>
    <empName>Raksha</empName> 
 </Person2>
</List>
  

Я пробовал следующий код, но у меня не работает:(
Проблема в том, что Person1 и Person2 — это разные имена.
Что мне нужно изменить, чтобы получить все идентификаторы?

 $XMLfile = 'C:test.xml'
[XML]$empDetails = Get-Content $XMLfile
 
foreach($module in $empDetails.List.$module){
Write-Host "Id :" $module.Id
}
  

С помощью этого кода я получаю только идентификатор Person1:

 $XMLfile = 'C:test.xml'
[XML]$empDetails = Get-Content $XMLfile
     
foreach($module in $empDetails.List.Person1){
Write-Host "Id :" $module.Id
}
  

Ответ №1:

Что я должен изменить?

Прежде всего: Вам нужно изменить <Person1> и <Person2> на <Person> в вашем XML. Не используйте имена элементов с суффиксом counter, потому что это делает обработку XML излишне сложной (и потому что это совершенно бессмысленно — если в XML описаны два человека, то предполагается, что они оба <Person> ).

Это делает доступ к XML простым и логичным:

 foreach ($person in $empDetails.List.Person) {
    Write-Host "Id :" $person.Id
}
  

Второе: вам нужно изменить способ чтения XML-файлов. Никогда не используйте Get-Content для чтения XML-файлов. Всегда создавайте объект XML document и .Load() XML через путь к файлу.

 $empDetails = New-Object xml
$empDetails.Load('C:test.xml')
  

Это гарантирует, что кодировка файла обрабатывается правильно (т. Е. <?xml version="1.0" encoding="ISO-8859-1"?> ). Использование Get-Content этого не сделает, что может привести к повреждению данных.

Комментарии:

1. Спасибо за ваши предложения, к сожалению, я не могу изменить имена Person1 и Person2. Я создал этот xml только для иллюстрации моей проблемы. Есть ли способ проанализировать XML с помощью Person1 и Person2?

2. @Thomas Вы можете использовать $x.List.ChildNodes . XML-интерфейс PowerShell построен на . System.Xml Иерархия объектов СЕТИ. Вы можете делать все, что поддерживается там, например, в этом случае используйте все, что System.Xml.XmlElement может предложить ( docs ).

3. Я попробовал это, но это не сработало… Не могли бы вы мне помочь, пожалуйста?

4. @Thomas Да, ваша переменная не вызывается $x . Не копируйте и не вставляйте мой код. Понять и адаптировать его.