Récupérer les données d'un fichier XML et les éditer

2

Supposons l'exemple suivant:

J'ai un fichier XML appelé plants.xml

<?xml version="1.0" encoding="utf-8"?>
<Plant>
<Zone Left="{PRKNG-7}">
<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="{PRKNG-8}">
<Data key="Zone">4</Data>
<Data key="Light">Shade</Data>
<Data key="Depth">Surface</Data>
<Data key="Availability">23262156</Data>
</Direction>
</Plant>

Avec PowerShell, je souhaite récupérer le numéro "23262156" derrière "Disponibilité", ajouter 1 et enregistrer à nouveau le code XML.

Je ne veux pas remplacer le nombre (puisqu'il est différent à chaque fois), il suffit d'ajouter 1, pour qu'il s'agisse de 23262157.

La prochaine fois, le nombre pourrait être 234159 et je voudrais ajouter 1, ce sera donc 234160.

Pour être clair: je ne veux pas utiliser pour "remplacer" la commande. Get-Content c: \ 1.txt | ForEach-Object {$ _ -replace "23262156", "23262157"} | Set-Content c: \ 1.txt Je veux utiliser quelque chose comme "23262156" +1 donc le résultat est 23262157. Parce que la prochaine fois que j'exécuterai le script, il pourrait y avoir un autre numéro. Si j'exécute une commande "replace", le résultat sera à nouveau 23262157 au lieu du nombre +1.

James
la source
La disponibilité est-elle toujours sur la même ligne?
Sonamor
(1) Je ne comprends pas ce que vous entendez par «je ne veux pas remplacer le numéro». Vous voulez écrire «03262157» dans le fichier, n'est-ce pas? Pour vous voulez ajouter une entrée qui dit <Data key="Availibility">03262157</Data> en plus de celle qui dit <Data key="Availibility">03262156</Data> ? Non? Vous voulez remplacer celui qui dit <Data key="Availibility">03262156</Data>par celui qui dit <Data key="Availibility">03262157</Data>? S'il vous plaît, expliquez. (2) Juste par curiosité, vos données ne sont-elles pas mal orthographiées «Disponibilité»? (3) Avez-vous vraiment besoin de préserver les zéros non significatifs? … (Suite)
Scott le
(Suite)… (4) Il est généralement recommandé d'utiliser un analyseur XML pour analyser le code XML et de ne pas essayer de l'approcher avec des outils de traitement de texte à usage général. ………………………………………… S'il vous plaît ne répondez pas dans les commentaires; Modifiez votre question pour la rendre plus claire et complète.
Scott
(1) j'ai expliqué un peu mieux. Aucune commande Remplacer, mais faites la somme du nombre +1. (2) Type, il devrait être "Disponibilité". Désolé :) (3) En fait, le nombre peut varier, mais c'était un mauvais exemple. Il n'y aura jamais de zéro non significatif. (4) Je sais, mais je n'arrive pas à comprendre. C'est pourquoi j'ai besoin de votre aide.
James le
Non, la disponibilité n'est pas toujours sur la même ligne.
James le

Réponses:

1

Utilisez 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") 

Avec la feuille de style suivante:

<?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>

Ce qui produit la sortie suivante:

http://fiddle.frameless.io/ Références

Paul Sweatte
la source