Как загрузить или прочитать файл XML с помощью ConvertTo-Xml и Select-Xml?
Как я могу выполнить что-то вроде этого:
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $date=(Get-Date | ConvertTo-Xml)
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $date
xml Objects
--- -------
version="1.0" encoding="utf-8" Objects
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $date.OuterXml
<?xml version="1.0" encoding="utf-8"?><Objects><Object Type="System.DateTime">12/12/2020 2:43:46 AM</Object></Objects>
PS /home/nicholas/powershell>
но вместо этого чтение в файле?
как мне загрузить/импортировать/читать/конвертировать файл, используя
ConvertTo-Xml
для разбора с
Select-Xml
с использованием
Xpath
?
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml=ConvertTo-Xml ./bookstore.xml
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml
xml Objects
--- -------
version="1.0" encoding="utf-8" Objects
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml.InnerXml
<?xml version="1.0" encoding="utf-8"?><Objects><Object Type="System.String">./bookstore.xml</Object></Objects>
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> $xml.OuterXml
<?xml version="1.0" encoding="utf-8"?><Objects><Object Type="System.String">./bookstore.xml</Object></Objects>
PS /home/nicholas/powershell>
PS /home/nicholas/powershell> cat ./bookstore.xml
<?xml version="1.0"?>
<!-- A fragment of a book store inventory database -->
<bookstore xmlns:bk="urn:samples">
<book genre="novel" publicationdate="1997" bk:ISBN="1-861001-57-8">
<title>Pride And Prejudice</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>24.95</price>
</book>
<book genre="novel" publicationdate="1992" bk:ISBN="1-861002-30-1">
<title>The Handmaid's Tale</title>
<author>
<first-name>Margaret</first-name>
<last-name>Atwood</last-name>
</author>
<price>29.95</price>
</book>
<book genre="novel" publicationdate="1991" bk:ISBN="1-861001-57-6">
<title>Emma</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>19.95</price>
</book>
<book genre="novel" publicationdate="1982" bk:ISBN="1-861001-45-3">
<title>Sense and Sensibility</title>
<author>
<first-name>Jane</first-name>
<last-name>Austen</last-name>
</author>
<price>19.95</price>
</book>
</bookstore>
PS /home/nicholas/powershell>
Создание
xml
файл внутри
REPL
сама консоль работает как положено:
Как анализировать XML в Powershell с помощью Select-Xml и Xpath?
1 ответ
Правильное чтение XML-документа в Powershell работает следующим образом:
$doc = New-Object xml
$doc.Load( (Convert-Path bookstore.xml) )
XML может иметь различные кодировки файлов, и с помощью
XmlDocument.Load
метод гарантирует, что файл будет правильно прочитан без предварительного знания кодировки.
Не чтение файла с правильной кодировкой приведет к искаженным данным или ошибкам, за исключением очень простых или очень удачных случаев.
Часто встречающийся метод использования и приведения результирующей строки к
[xml]
именно по этой причине неправильный способ работы с XML. Так что не делай этого.
Вы можете получить правильный результат с помощью , но для этого требуется
- Предварительное знание кодировки файла (например,
Get-Content bookstore.xml -Encoding UTF8
) - Жестко закодируйте кодировку файла в свой сценарий (это означает, что он сломается, если кодировка XML когда- либо неожиданно изменится)
- Ограничение себя очень немногими поддерживаемыми кодировками файлов (XML поддерживает больше)
Это означает, что вы ставите себя в положение, когда вам приходится вручную обдумывать и решать проблему, для которой XML был специально разработан для автоматического решения за вас.
Делать вещи правильно с
Get-Content
много ненужной дополнительной работы и ограничений. И делать что-то неправильно бессмысленно, когда сделать это правильно так просто.
Примеры после загрузки
$doc
как показано выше.
$doc.bookstore.book
печатает список
<book>
элементы и их свойства
genre : novel
publicationdate : 1997
ISBN : 1-861001-57-8
title : Pride And Prejudice
author : author
price : 24.95
genre : novel
publicationdate : 1992
ISBN : 1-861002-30-1
title : The Handmaid's Tale
author : author
price : 29.95
genre : novel
publicationdate : 1991
ISBN : 1-861001-57-6
title : Emma
author : author
price : 19.95
genre : novel
publicationdate : 1982
ISBN : 1-861001-45-3
title : Sense and Sensibility
author : author
price : 19.95
$doc.bookstore.book | Format-Table
печатает то же самое, что и таблица
genre publicationdate ISBN title author price
----- --------------- ---- ----- ------ -----
novel 1997 1-861001-57-8 Pride And Prejudice author 24.95
novel 1992 1-861002-30-1 The Handmaid's Tale author 29.95
novel 1991 1-861001-57-6 Emma author 19.95
novel 1982 1-861001-45-3 Sense and Sensibility author 19.95
$doc.bookstore.book | Where-Object publicationdate -lt 1992 | Format-Table
фильтрует данные
genre publicationdate ISBN title author price
----- --------------- ---- ----- ------ -----
novel 1991 1-861001-57-6 Emma author 19.95
novel 1982 1-861001-45-3 Sense and Sensibility author 19.95
$doc.bookstore.book | Where-Object publicationdate -lt 1992 | Sort publicationdate | select title
сортирует и печатает только
<title>
поле
title
-----
Sense and Sensibility
Emma
Есть много других способов нарезки и нарезки данных, все зависит от того, что вы хотите сделать.