Отримайте дані з XML-файлу та відредагуйте їх


2

Припустимо наступний приклад:

У мене є XML-файл з назвою рослини.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>

За допомогою PowerShell я хочу отримати номер "23262156" позаду "Доступність", додати 1 і зберегти XML знову.

Я не хочу замінювати число (оскільки воно щоразу відрізняється), просто додайте 1, щоб воно було 23262157.

Наступного разу число може бути 234159, і я хочу додати ще 1, тож це буде 234160.

Щоб було зрозуміло: я не хочу використовувати команду "заміна". Get-Content c: \ 1.txt | ForEach-Object {$ _ -замінити "23262156", "23262157"} | Set-Content c: \ 1.txt Я хочу використовувати щось на кшталт "23262156" +1, щоб результат був 23262157. Тому що наступного разу, коли я запускаю сценарій, може бути інше число. Якщо я виконаю команду "Замінити", результат буде знову 23262157 замість числа +1.


Чи завжди доступність знаходиться в одній лінії?
Сонамор

(1) Я не розумію, що ви маєте на увазі під "я не хочу замінювати номер". Ви хочете написати "03262157" у файл, чи не так? Ви хочете додати запис, який говорить <Data key="Availibility">03262157</Data> на додаток до того, який говорить <Data key="Availibility">03262156</Data> ? Немає? Ви хочете замінити той, що говорить, <Data key="Availibility">03262156</Data>на той, що говорить <Data key="Availibility">03262157</Data>? Будь ласка, поясніть. (2) З цікавості, чи справді ваші дані неправильно написали "Наявність"? (3) Чи дійсно вам потрібно зберегти провідні нулі? … (Продовження)
Скотт

(Продовження)… (4) Зазвичай рекомендується використовувати парсер XML для розбору XML, а не намагатися наближатися до нього за допомогою інструментів для обробки тексту загального призначення. ………………………………………… Будь ласка, не відповідайте на коментарі; відредагуйте своє запитання, щоб зробити його більш зрозумілим та повним.
Скотт

(1) Я пояснив трохи краще. Ні команда Замінити, але складіть суму числа +1. (2) Введіть, це має бути "Доступність". Вибачте :) (3) Я фактично кількість може змінюватися, але це був поганий приклад. Ніколи не буде провідного нуля. (4) Я знаю, але не можу цього зрозуміти. Ось чому мені потрібна ваша допомога.
Джеймс

Ні, доступність не завжди знаходиться в одній лінії.
Джеймс

Відповіді:


1

Використовуйте 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") 

З наступними таблицями стилів:

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

Що дає наступний вихід:

http://fiddle.frameless.io/ Список літератури

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.