2017-02-22 1 views
-2

Lassen Sie mich vorweg sagen, ich habe begrenzte Powershell-Erfahrung und würde gerne alternative Anwendungen für meine Bedürfnisse akzeptieren.Powershell-Skript, um xml-Tag gleich einem anderen xml-Tag in derselben Zeile zu setzen

Ich habe eine XML-Datei mit folgendem Beispiel:

<!-- ... --> 
<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> 
<!-- ... --> 

Was ich passieren soll, ist:

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

dies würde also mit den Linien 1 und 3 und Update tag3 seine 2,00

So kompletter Code, den ich benötigen würde: Datei öffnen Bearbeitungen durchführen Datei speichern

+1

Was zeigen Sie hier nicht eine XML-Datei. Bitte zeigen Sie eine tatsächliche Eingabedatei und wie genau die Ausgabe in diesem Fall aussehen würde. Weitere Hilfe: http://stackoverflow.com/help/mcve. –

+0

nun, was hast du probiert, was nicht funktioniert? – 4c74356b41

+0

Wir sind eine Community, die Programmierern und Programmierern hilft. Davon abgesehen erwarten Sie, dass Sie vor dem Einstellen zeigen, was Sie getan oder versucht haben. Das gibt uns etwas, worauf wir aufbauen können. Ab sofort liest sich das wie eine Code-Schreib-Anfrage, die für SO nicht in Frage kommt. Brechen Sie Ihre Frage in ihre Teile und suchen Sie individuell nach Lösungen für diese Probleme. Wenn Sie weiterhin Probleme haben, bearbeiten Sie bitte Ihre Frage zu Ihrer Arbeit, damit wir Ihnen und der Community besser helfen können. – Matt

Antwort

0

1) Suchen Sie die Elemente, die Sie aktualisieren möchten, mithilfe der SelectNodes-Funktion mit der entsprechenden XPath-Anweisung.

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

Der obige Code sagt jedes Element finden, die ein Attribut tag1 mit Werten 'A' oder 'D' hat und hat auch ein Attribut tag2 mit Wert 'B'.

2) Weisen Sie für jedes Element, das oben gefunden wird, das Attribut tag3 des Elements dem Wert seines Attributs tag4 zu.

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

Komplettlösung (mit Beispieldaten)

$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 

aktualisieren

ich auch festgestellt, dass Sie die XML-Datei aus genannten Lesen und es zurück in Datei Speichern ... während ich in dem oben genannten hatte ich gerade einen Wert der $xml Variable direkt zugewiesen, und zeigte die Ausgabe auf dem Bildschirm.

Um XML aus einer Datei zu lesen, verwenden Sie $xml = [raw](get-content 'c:\path\to\file.xml' -raw). Weitere Informationen (in der Tat, mit einem etwas anderen Ansatz) hier:

Um XML zurück zur Datei zu speichern, verwenden Sie einfach $xml.Save('c:\path\to\file.xml')

Auch hier weitere Informationen und alternative Ansätze hier:

+0

Vielen Dank. Ich lerne immer noch so den Code in Bezug auf das zu betrachten, was ich will, ist der beste Weg für mich, was zu sehen Jeder Teil tut was. Ich gebe das eine Chance, danke für deine Zeit. – Kwixotic

+0

Keine Sorge. Ich habe in den obigen Kommentaren bemerkt, dass du Regex nennst. NB: Es gibt einige Szenarien, in denen du Regex benutzen musst (zB wenn du handelst mit falsch formatiertem XML) ist es am besten, XPath zu verwenden, eine Technologie/Sprache, die speziell für dieses Szenario entwickelt wurde. Ein guter Einstieg ist https://www.w3schools.com/xml/xpath_intro.asp PowerShell habe ich durch https://www.goodreads.com/book/show/15815165-learn-windows-powershell-3-in-a-month-of-lunches gelernt und empfehle es wärmstens anderen ... obwohl es viele gibt andere Quellen verfügbar. https://www.slant.co/improve/topics/1060/ – JohnLBevan

Verwandte Themen