#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
. Не копируйте и не вставляйте мой код. Понять и адаптировать его.