2017-02-22 47 views
-2

Позвольте мне предисловие, сказав, что у меня ограниченный опыт использования powershell и с радостью принимаю альтернативные приложения для моих нужд.Скрипт Powershell для установки тега xml, равного другому тегу xml, в той же строке

У меня есть файл XML с помощью следующего примера:

<!-- ... --> 
<anElement tag1="A" tag2="B" tag3="0.00" tag4="2.00" /> 
<anotherElement tag1="C" tag2="B" tag3="0.00" tag4="2.00" /> 
<somethingElse tag1="D" tag2="B" tag3="0.00" tag4="2.00">maybe some text here?</somethingElse> 
<!-- ... --> 

То, что я хочу, чтобы случиться:

If tag1 = A or D 
And tag2 = B 
then set tag3 value = tag4 value 

Так что бы строки 1 и 3 и обновление Tag3 быть 2.00

Полный код мне нужен: открыть файл выполнить изменения сохранить файл

+1

То, что вы показать здесь не файл XML. Пожалуйста, покажите фактический входной файл и что именно будет выглядеть в этом случае. Дополнительная справка: http://stackoverflow.com/help/mcve. –

+0

ну, что ты пробовал, что не работает? – 4c74356b41

+0

Мы - сообщество, помогающее программистам и энтузиастам программирования. При этом ожидается, что вы покажете, что вы сделали или попробовали до публикации. Это дает нам кое-что опираться. На данный момент это читается как запрос написания кода, который отключен для SO. Разбейте свой вопрос на свои части и выполните индивидуальный поиск решений этих проблем. Затем, если у вас все еще есть проблемы, пожалуйста, отредактируйте свой вопрос, показывая свою работу, чтобы мы могли лучше помочь вам и сообществу. – Matt

ответ

0

1) Найдите элементы, которые вы хотите обновить, с помощью функции SelectNodes с соответствующим оператором XPath.

'//*[(./@tag1=''A'' or ./@tag1=''D'') and ./@tag2 = ''B'']' 

Приведенный выше код говорит найти любой элемент, который имеет атрибут tag1 со значениями 'A' или 'D', а также имеет атрибут tag2 со значением 'B'.

2) Для каждого элемента, найденного выше, присвойте этому элементу атрибут tag3 со значением его атрибута tag4.

| %{ #%{ is an alias (i.e. shorthand) for `| foreach-object` 
    $_.tag3 = $_.tag4 
} 

Полное решение (данные образца)

$xml = [xml]@" 
<xml> 
<something tag1="A" tag2="B" tag3="0.00" tag4="2.00" /> 
<something tag1="C" tag2="B" tag3="0.00" tag4="2.00" /> 
<something tag1="D" tag2="B" tag3="0.00" tag4="2.00" /> 
</xml> 
"@ 
$xml.SelectNodes('//*[(./@tag1=''A'' or ./@tag1=''D'') and ./@tag2 = ''B'']') | %{ 
    $_.tag3 = $_.tag4 
} 


##Demo Output (function from https://blogs.msdn.microsoft.com/powershell/2008/01/18/format-xml/) 
function Format-XML ([xml]$xml, $indent=2) 
{ 
    $StringWriter = New-Object System.IO.StringWriter 
    $XmlWriter = New-Object System.XMl.XmlTextWriter $StringWriter 
    $xmlWriter.Formatting = 'indented' 
    $xmlWriter.Indentation = $Indent 
    $xml.WriteContentTo($XmlWriter) 
    $XmlWriter.Flush() 
    $StringWriter.Flush() 
    Write-Output $StringWriter.ToString() 
} 
Format-XML $xml 

Update

Я также отметил, что вы упомянули чтение XML из файла и сохранить его обратно в файл ... в то время как в приведенном выше я просто присвоил значение переменной $xml и показал результат на экране.

Чтобы прочитать XML из файла, используйте $xml = [raw](get-content 'c:\path\to\file.xml' -raw). Более подробная информация (на самом деле, с несколько иным подходом) здесь:

Чтобы сохранить XML обратно в файл, просто использовать $xml.Save('c:\path\to\file.xml')

Опять же, больше информации и альтернативные подходы здесь:

+0

Большое спасибо. Я все еще учусь, глядя на код относительно того, что я хочу, чтобы это сделать, - лучший способ узнать, что Каждая деталь делает. Я дам этот снимок, спасибо за ваше время. – Kwixotic

+0

Не беспокойтесь. Я заметил в комментариях выше, что вы указываете регулярное выражение. NB: Пока есть сценарии, в которых вам нужно использовать регулярное выражение (например, если вы имеете дело с с неправильным XML), как правило, лучше всего использовать XPath, технологию/язык, специально предназначенный для этого сценария. Хорошим стартером является https://www.w3schools.com/xml/xpath_intro.asp. PowerShell я узнал через https://www.goodreads.com/book/show/15815165-learn-windows-powershell-3-in-a-month-of-lunches и очень рекомендую его другим ... хотя есть много доступны другие источники. https://www.slant.co/improve/topics/1060/ – JohnLBevan