Больше XML с PowerShell

В колонке прошлого месяца я рассмотрел некоторые более простые аспекты XML, проиллюстрированные некоторыми базовыми сценариями PowerShell. В колонке этого месяца я немного углублюсь в то, как использовать PowerShell с XML.

Возможно, вы помните из прошлого месяца, что вы можете создать документ XML DOM, набрав в командной строке PowerShell что-то вроде этого:

$orderdoc = [xml] (категория D: XmlOrder.xml)

Предполагается, что файл с именем order.xml уже существует в папке D: Xml и что XML, содержащийся в этом файле, действителен. Мы создали действительный файл, который вы найдете по адресу www.pcpro.co.uk/links/151dotnet.

На снимке экрана ниже вы можете увидеть этот XML-документ, просмотренный с помощью бесплатной утилиты XMLPad. Разработано WMHelp (www.wmhelp.com), XMLPad — наиболее полезный инструмент при работе с XML, тем более что он бесплатный. Как видите, XML-файл содержит корневой узел. , который имеет два подузла – и – оба из которых имеют свои собственные подузлы. Как я отмечал в прошлом месяце, вы можете напрямую обращаться к конкретным узлам с помощью PowerShell, поэтому для получения имени клиента можно просто ввести $OrderDoc. Заказ. Заголовок заказа. Имя клиента, а чтобы получить номер клиента, нужно указать $OrderDoc. Заказ. Заголовок заказа. Пользовательский ИД. Теги XML чувствительны к регистру, поэтому наличие открывающего тега

и закрывающий тег вызовет ошибку, поскольку остается открытым. Хотя XML чувствителен к регистру, PowerShell — нет. Это означает, что в предыдущем примере для получения идентификатора клиента вы могли бы указан либо $orderdoc.order.orderheader.customerID, либо $ORDERDOC.ORDER.ORDERHEADER.CUSTOMERID (или любая другая комбинация капитализация). Поэтому на всякий случай я обычно рекомендую использовать те же имена узлов, которые указаны в XML (с учетом регистра), чтобы избежать путаницы в коде PowerShell.

Обновление XML-документа

Обновление XML-документа заказа с помощью PowerShell выполняется просто с использованием типов объектов .NET XML Document и XML Element. Следующий код считывает существующий заказ, добавляет к нему новую строку, а затем записывает обновленный заказ обратно в новый файл:

#Addline.ps1 – добавляет строку заказа в d: fooorder.xml

# записывает заказ в d: foo

eworder.xml

# Шаг 1 – создать документ в памяти

$doc=[xml] (кот d: fooorder.xml)

# Шаг 2 – создаем элемент строки заказа

$ол=$док. CreateElement («Строка заказа»)

# Шаг 3 – создайте и заполните подпункты

$Предмет = $док. CreateElement("ItemID")

$предмет. Set_InnerText («876543»)

$Itemd = $док. CreateElement («Описание элемента»)

$itemd. Set_InnerText («Невидимые виджеты»)

$Numordered = $doc. CreateElement("NumberOrdered")

$numOrdered. Set_InnerText («21»)

$Цена = $док. СоздатьЭлемент("Цена")

$цена. Set_Innertext («321,12»)

# Шаг 4 – Теперь создайте строку заказов

$ол. AppendChild($item)

$ол. AppendChild($itemd)

$ол. AppendChild($numordered)

$ол. AppendChild($цена)

# Шаг 5, наконец, добавьте строку заказа в заказ.

$doc.order.orderlines.appendchild($ol)

#Шаг 6 – сохраните документ.

$doc.save("d: fooNeworder.xml")

Добавление строки заказа состоит из шести шагов. Сначала документ открывается и присваивается $doc. Обратите внимание, что это удается только в том случае, если XML-документ правильно сформирован, но для простоты я опустил код обработки ошибок для восстановления после ошибок в XML. Шаг 2 создает новый пустой элемент XML с именем $ol, который представляет новую строку заказа. Элемент создается с использованием метода CreateElement XML-документа. На шаге 3 метод CreateElement используется для создания элементов-компонентов строки заказа ($item, $itemd, $numordered и $price). Метод Set_InnerText используется для присвоения значения каждому из этих элементов компонента. На шаге 4 эти отдельные компоненты добавляются к значению $ol, что создает полностью новую строку заказа. На шаге 5 этот новый элемент строки заказа добавляется к элементу строки заказа документа заказа и, наконец, на шаге 6 обновленный заказ записывается обратно в новый файл с именем (d: foo