Mer XML med PowerShell

I förra månadens kolumn tittade jag på några av de enklare aspekterna av XML, illustrerade med några grundläggande PowerShell-skript. I denna månads kolumn kommer jag att våga mig lite djupare på hur man använder PowerShell med XML.

Du kanske minns från förra månaden att du kan skapa ett XML DOM-dokument genom att skriva en PowerShell-kommandorad ungefär så här:

$orderdoc = [xml] (Cat D:XmlOrder.xml)

Detta förutsätter att en fil som heter order.xml redan finns i mappen D:Xml och att XML-filen i filen är giltig. Vi har tagit fram en giltig fil, som du hittar på www.pcpro.co.uk/links/151dotnet.

I skärmdumpen nedan kan du se detta XML-dokument som det visas med hjälp av gratisprogramverktyget XMLPad. Utvecklad av WMHelp (www.wmhelp.com), XMLPad är ett mycket användbart verktyg när du arbetar med XML, särskilt eftersom det är gratis. Som du kan se innehåller XML-filen en rotnod , som har två subnoder – och – som båda har sina egna subnoder. Som jag noterade förra månaden kan du adressera specifika noder direkt genom att använda PowerShell, så för att få kundnamnet kan du bara ange $OrderDoc.Order.Orderheader.Customername, medan du för att få kundnumret skulle ange $OrderDoc.Order. Orderheader.CustomerID. XML-taggar är skiftlägeskänsliga, så att ha en öppningstagg och en avslutande tagg skulle generera ett fel, eftersom lämnas öppen. Även om XML är skiftlägeskänsligt är det inte PowerShell, vilket betyder att i det tidigare exemplet för att hämta ett kund-ID kunde du ha angett antingen $orderdoc.order.orderheader.customerID eller $ORDERDOC.ORDER.ORDERHEADER.CUSTOMERID (eller någon annan kombination kapitalisering). För att vara på den säkra sidan rekommenderar jag därför generellt att du använder samma nodnamn som anges i XML (skiftlägeskänsligt) för att undvika förvirring i din PowerShell-kod.

Uppdatering av ett XML-dokument

Att uppdatera XML-orderdokumentet med PowerShell är enkelt med objekttyperna .NET XML Document och XML Element. Följande kod läser den befintliga ordern, lägger till en ny rad i ordern och skriver sedan tillbaka den uppdaterade ordern till en ny fil:

#Addline.ps1 – lägger till en beställningsrad i beställningen i d:fooorder.xml

# skriver order till d:foo

eworder.xml

# Steg 1 – skapa dokument i minnet

$doc=[xml] (cat d:fooorder.xml)

# Steg 2 – skapa orderradselement

$ol=$doc.CreateElement(“OrderLine”)

# Steg 3 – skapa och fyll i underobjekt

$Item = $doc.CreateElement(“ItemID”)

$item.Set_InnerText(“876543”)

$Itemd = $doc.CreateElement(“ItemDescription”)

$itemd.Set_InnerText(“Osynliga widgetar”)

$Numordered = $doc.CreateElement(“NumberOrdered”)

$numOrdered.Set_InnerText(“21”)

$Price = $doc.CreateElement(“Pris”)

$price.Set_Innertext(“321.12”)

# Steg 4 – Bygg nu upp orderlinje

$ol.AppendChild($item)

$ol.AppendChild($itemd)

$ol.AppendChild($numordered)

$ol.AppendChild($price)

# Steg 5, slutligen, lägg till beställningsraden i beställningen.

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

#Steg 6 – spara bort dokumentet.

$doc.save(“d:fooNeworder.xml”)

Det finns sex steg för att lägga till beställningsraden. Först öppnas dokumentet och tilldelas $doc. Observera att detta bara lyckas om XML-dokumentet är välformaterat, men för enkelhetens skull har jag utelämnat eventuell felhanteringskod för att återställa från fel i XML. Steg 2 skapar ett nytt tomt XML-element som heter $ol, som representerar en ny orderrad. Elementet skapas med metoden CreateElement i ett XML-dokument. I steg 3 används CreateElement-metoden för att skapa beställningsradens komponentelement ($item, $itemd, $numordered och $price). Metoden Set_InnerText används för att tilldela ett värde till vart och ett av dessa komponentelement. I steg 4 läggs dessa individuella komponenter till $ol-värdet, vilket skapar en helt ny orderrad. Med steg 5 läggs detta nya orderradselement till orderdokumentets orderradselement och slutligen, i steg 6, skrivs den uppdaterade ordern tillbaka till en ny fil som heter (d:foo

Lämna en kommentar

Din e-postadress kommer inte publiceras.