Подтвердить что ты не робот

Анализ XML в PowerShell

У меня есть следующий xml:

<?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? (Я понимаю, что могу просто использовать замену грязной строки, но я бы предпочел сделать это "правильно".

4b9b3361

Ответ 1

Эта версия использует немного больше PowerShell и обрабатывает случай с несколькими элементами с помощью клавиш 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- Файл, например:

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

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

Ответ 2

Вы можете попробовать это

$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 для выбора node.

Ответ 3

Вы можете загрузить свой XML в класс LINQ XDocument из PowerShell следующим образом:

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

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

Ответ 4

$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
}