Как загрузить или прочитать файл 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. Так что не делай этого.

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

  1. Предварительное знание кодировки файла (например, Get-Content bookstore.xml -Encoding UTF8)
  2. Жестко закодируйте кодировку файла в свой сценарий (это означает, что он сломается, если кодировка XML когда- либо неожиданно изменится)
  3. Ограничение себя очень немногими поддерживаемыми кодировками файлов (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

Есть много других способов нарезки и нарезки данных, все зависит от того, что вы хотите сделать.

Другие вопросы по тегам