2009-11-12 5 views
18

У меня есть следующий XML:Анализировать XML в PowerShell

<?xml version="1.0" encoding="UTF-8"?> 
<sections> 
    <section name="Options"> 
    <item key="HLVersionControlWebServiceURL" value="http://www.personec.no/webservices/HLVersionControl/HLVersionControl.asmx" /> 
    <item key="AltinnWebServiceURL" value="https://www.altinn.no/webservices/DataExchange.asmx" /> 
    <item key="WorkDir" value="F:\Altinn\Work\" /> 
    <item key="CatalogDir" value="F:\Altinn\Work\" /> 
    </section> 
    <section name="Users"> 
    <item key="1" value="Admin" name="Administrator" fNr="" password="" entsystype="1" entsysid="180967" entsyspassword="" lastLogin="20091111161516" allowra0500="1" allowrf1037="1" allowra01821="1" allowra01822="0" allowrf1015="1" altinnuserpassword="/qwHHYwYinE=" /> 
    </section> 
    <section name="SchemaTypes"> 
    <item key="RF1037" displayname="Terminoppgave" inputdir="F:\Altinn\Work\" validationschema=".\melding-669-8570.xsd" isSubForm="0" isSignable="0" /> 
    <item key="RA0500" displayname="SSB Lønnsstatistikk" inputdir="C:\Program Files (x86)\Personec\Altinn Monitor\Work\" validationschema=".\melding-868-7612.xsd" isSubForm="0" isSignable="0" /> 
    <item key="RA01821" displayname="SSB Fraværsstatistikk bedrift" inputdir="C:\Program Files (x86)\Personec\Altinn Monitor\Work\" validationschema=".\melding-862-6190.xsd" isSubForm="0" isSignable="0" /> 
    <item key="RF1015" displayname="Årsoppgave m/ LTO" inputdir="C:\Program Files (x86)\Personec\Altinn Monitor\Work\" validationschema=".\melding-210-7928.xsd" orid="210" orversion="7928" isSubForm="0" isSignable="1" /> 
    <item key="RF1015U" displayname="" inputdir="" validationschema=".\melding-1083-7930.xsd" orid="1083" orversion="7930" isSubForm="1" isSignable="1" /> 
    </section> 
</sections> 

И мне нужно, чтобы изменить ключ Workdir элемента в Powershell. При использовании «обычного» xml-read я попадаю в верхние разделы (параметры, пользователи и т. Д.), Но не в узлы «ключ элемента» внутри каждого. Как изменить значение для WorkDir в powershell? (Я понимаю, что я мог бы просто использовать грязную строку заменить, но я предпочел бы сделать это «правильно»

+0

это [размещение] [1] работал лучше для меня [1]: http://stackoverflow.com/questions/1328490/update-configsource-of-xml-element-in -web-config-using-powershell-by-through-in-p –

ответ

13

Эта версия использует немного больше PowerShell и обрабатывает случай Mulitple элементов с Workdir ключей:

$xml = [xml](Get-Content foo.xml) 
$xpath = "/sections/section/item[@key='WorkDir']" 
Microsoft.PowerShell.Utility\Select-Xml $xml -XPath $xpath | 
    Foreach {$_.Node.SetAttribute('value', $pwd)} 
$xml.Save("$pwd\bar.xml") 

Примечание, если у вас есть PowerShell Community Extensions установки вы можете использовать командлет Format-Xml для форматирования вывода и сохранить его с помощью Out-File, например:

$xml | Format-Xml -AttributesOnNewLine | Out-File bar.xml -enc utf8 

OTOH $ xml.Save() проще, за исключением, что вы должны помнить, что это, вероятно, не правильный реж тока, если вы должны были указать только имя файла. Вот почему я использовал «$ pwd \ bar.xml» в первом примере. Это не проблема с командлетами PowerShell, такими как Out-File.

+0

Отлично! Хотя моя Powershell с модулями не может найти «Format-Xml» по любой причине.Я должен был использовать Сохранить. – 2012-04-03 14:26:56

+0

@RiverC, Извините. Format-Xml - это команда из PowerShell Community Extenions - http://pscx.codeplex.com. Я должен был упомянуть об этом. –

6

Вы можете загрузить XML в класс LINQ XDocument из PowerShell, как это:.

[Reflection.Assembly]::LoadWithpartialName("System.Xml.Linq") | Out-Null 
$xDoc = [System.Xml.Linq.XDocument]::Parse($myXmlString) 

Оттуда вы можете использовать обычный LINQ к методам XML, чтобы заменить атрибут как в this example. при желании вы можете использовать старую XmlDocument класс аналогичным образом.

+0

Спасибо. Я как бы надеялся, что смогу сделать это изнутри из powershell без использования каких-либо других классов .Net. – Trondh

+0

Построение Powershell в XML-поддержке - фактически XmlDocument - поэтому оно должно быть возможно «изначально» в powershell. Я играю, это странно. – Murph

+1

Имейте в виду, что PowerShell не поддерживает синтаксис метода статического расширения C# 3.0, в котором вы можете вызвать метод ext для экземпляра. И IIRC, PowerShell также не поддерживает вызов общих методов. Итак, пока вы просто создаете объекты XLINQ, вы в порядке, но если вы попытаетесь использовать возможности запроса LINQ (System.Linq.Enumerable), это будет бесполезным упражнением. –

10

вы могли бы попробовать это

$xmlFile = "d:\sample.xml" 

[xml]$doc = Get-Content $xmlFile 
$node = $doc.SelectSingleNode("/sections/section/item[@key='WorkDir']") 
$node.Value = "New-Value" 
$doc.Save($xmlFile) 

Вы по-прежнему будете использовать некоторые .Net-классы и запрос XPath для выбора узла.

+2

Командлет Select-Xml в PowerShell 2.0 можно использовать вместо вызова метода SelectSingleNode. –

+0

Select-Xml доступен в PowerShell 1.0, однако, я думаю, что это все же самый простой способ доступа и изменения значения атрибута. – 2009-11-12 16:31:49

+0

FYI, Select-Xml * не * доступен в PowerShell 1.0. Он поставляется с расширениями сообщества PowerShell, что, вероятно, связано с тем, что вы видите его в версии 1.0. –

-1
$invocation = (Get-Variable MyInvocation).Value 
$directorypath = Split-Path $invocation.MyCommand.Path 


[xml]$userfile = Get-Content $directorypath\MainSetting.xml 
$Value = $userfile.GetElementsByTagName("node") 

Foreach ($ValueName in $Value) 
{ 
    $FinalValue=$ValueName.InnerXML 
} 
Смежные вопросы