Rufen Sie Daten aus der XML-Datei ab und bearbeiten Sie sie

468
James

Nehmen wir folgendes Beispiel an:

Ich habe eine XML-Datei namens plants.xml

<?xml version="1.0" encoding="utf-8"?> <Plant> <Zone Left=""> <Data key="Bloodroot">Sanguinaria_canadensis</Data> <Data key="Columbine">Aquilegia_canadensis</Data> <Data key="Hepatica">Hepatica_americana</Data> <Data key="Mayapple">Podophyllum_peltatum</Data> </Zone> <Direction Right=""> <Data key="Zone">4</Data> <Data key="Light">Shade</Data> <Data key="Depth">Surface</Data> <Data key="Availability">23262156</Data> </Direction> </Plant> 

Mit PowerShell möchte ich die Nummer "23262156" hinter "Verfügbarkeit" abrufen, 1 hinzufügen und das XML erneut speichern.

Ich möchte die Nummer nicht ersetzen (da sie jedes Mal anders ist), fügen Sie einfach 1 hinzu, so dass es sich um 23262157 handelt.

Das nächste Mal könnte es sich um 234159 handeln, und ich möchte noch einmal 1 hinzufügen, also 234160.

Um es klar zu sagen: Ich möchte den Befehl nicht "ersetzen". Get-Content c: \ 1.txt | ForEach-Objekt {$ _ -replace "23262156", "23262157"} | Set-Content c: \ 1.txt Ich möchte etwas wie "23262156" +1 verwenden, das Ergebnis lautet also 23262157. Das nächste Mal, wenn ich das Skript starte, könnte es eine andere Nummer geben. Wenn ich einen "Ersetzen" -Befehl ausführe, ist das Ergebnis 23262157 anstelle der Zahl +1.

2
Ist die Verfügbarkeit immer auf derselben Linie? Sonamor vor 6 Jahren 0
(1) Ich verstehe nicht, was Sie unter "Ich möchte die Zahl nicht ersetzen" bedeuten. Sie möchten "03262157" in die Datei schreiben, nicht wahr? Sie möchten einen Eintrag hinzufügen, der "03262157` * zusätzlich zu der mit * `03262156`? Nein? Sie möchten denjenigen mit * ersetzen *03262156` mit der Angabe `03262157`? Bitte erkläre. (2) Nur aus Neugier sind Ihre Daten wirklich "Verfügbarkeit"? (3) Müssen Sie wirklich die führenden Nullen bewahren? … (Fortsetzung) Scott vor 6 Jahren 0
(Forts.)… (4) Es ist [allgemein empfohlen] (https://stackoverflow.com/q/1732348/1672723#1732454), dass Sie einen * XML-Parser * verwenden, um XML zu parsen, und nicht versuchen, darauf zuzugreifen mit allgemeinen Textverarbeitungswerkzeugen. ……………………………………… Bitte antworten Sie nicht in Kommentaren; Bearbeiten Sie Ihre Frage, um sie klarer und vollständiger zu machen. Scott vor 6 Jahren 0
(1) Ich habe es etwas besser erklärt. Kein Ersetzungsbefehl, aber machen Sie die Summe der Zahl +1. (2) Typ, es sollte "Verfügbarkeit" sein. Sorry :) (3) Die Anzahl kann variieren, aber es war ein schlechtes Beispiel. Es wird niemals eine führende Null geben. (4) Ich weiß, aber ich kann es nicht verstehen. Deshalb brauche ich deine Hilfe. James vor 6 Jahren 0
Nein, Verfügbarkeit ist nicht immer in derselben Zeile. James vor 6 Jahren 0

1 Antwort auf die Frage

1
Paul Sweatte

Verwenden Sie XSLT:

#transform to HTML report $xslt=New-Object System.Xml.Xsl.XslCompiledTransform $xslt.Load("$pwd\transform.xsl") $xslt.Transform("$pwd\original.xml","$pwd\result.xml")  

Mit dem folgenden Stylesheet:

<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" > <xsl:template match="node()" mode="print">  <xsl:choose>  <!-- is it element? --> <xsl:when test="name()"> <br />  <!-- start tag --> <xsl:text>&lt;</xsl:text> <xsl:value-of select="name()" />  <!-- attributes --> <xsl:apply-templates select="@*" mode="print" />  <xsl:choose>  <!-- has children --> <xsl:when test="node()"> <!-- closing bracket --> <xsl:text>&gt;</xsl:text>  <!-- children --> <xsl:apply-templates mode="print" />  <!-- end tag --> <xsl:text>&lt;/</xsl:text> <xsl:value-of select="name()" /> <xsl:text>&gt;</xsl:text> <br /> </xsl:when>  <!-- is empty --> <xsl:otherwise>  <!-- closing bracket --> <xsl:text>/&gt;</xsl:text><br />  <br /> </xsl:otherwise>  </xsl:choose>  </xsl:when>  <!-- text --> <xsl:otherwise> <xsl:copy /> </xsl:otherwise>  </xsl:choose>  </xsl:template>  <xsl:template match="@*" mode="print"> <xsl:text> </xsl:text> <xsl:value-of select="name()" /> <xsl:text>=&quot;</xsl:text> <xsl:value-of select="." /> <xsl:text>&quot;</xsl:text> </xsl:template>   <xsl:template match="text()" mode="print"> <xsl:choose>  <xsl:when test="contains(parent::node()/@key, 'Availability')"> <xsl:value-of select="number(current()) + 1" /> </xsl:when>  <xsl:otherwise> <xsl:value-of select="." /> </xsl:otherwise> </xsl:choose> </xsl:template>  <xsl:template match="/"> <xsl:apply-templates mode="print" /> </xsl:template>  </xsl:stylesheet> 

Was ergibt die folgende Ausgabe:

http://fiddle.frameless.io/ Verweise