Получить данные из файла XML и редактировать их

376
James

Предположим, следующий пример:

У меня есть XML-файл с названием Plant.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> 

В PowerShell я хочу получить число «23262156» за «Доступностью», добавить 1 и снова сохранить XML.

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

В следующий раз число может быть 234159, и я хочу добавить 1 снова, так что это будет 234160.

Чтобы было ясно: я не хочу использовать команду «заменить». Get-Content c: \ 1.txt | ForEach-Object {$ _ -relace "23262156", "23262157"} | Set-Content c: \ 1.txt Я хочу использовать что-то вроде «23262156» +1, так что результат будет 23262157. Потому что в следующий раз, когда я запустите скрипт, может быть другое число. Если я выполню команду «заменить», то результатом будет снова 23262157 вместо числа +1.

2
Доступность всегда на одной линии? Sonamor 5 лет назад 0
(1) Я не понимаю, что вы подразумеваете под «я не хочу заменять число». Вы хотите написать «03262157» в файл, не так ли? Вы хотите *** добавить *** запись, которая говорит `03262157` * в дополнение к тому, что говорит * `03262156`? Нет? Вы хотите * заменить * тот, который говорит `03262156` с тем, который говорит `03262157`? Пожалуйста, объясни. (2) Просто из любопытства, действительно ли ваши данные неправильно пишут «Доступность»? (3) Вам действительно нужно сохранить ведущие нули? … (Продолжение) Scott 5 лет назад 0
(Продолжение)… (4) [Обычно рекомендуется] (https://stackoverflow.com/q/1732348/1672723#1732454) использовать синтаксический анализатор * XML * для анализа XML, а не пытаться приблизиться к нему. с универсальными инструментами обработки текста. ... ... ... ... ... ... ... ... ... ... ... ... ... ... Пожалуйста, не отвечайте в комментариях; [отредактируйте] ваш вопрос, чтобы сделать его более понятным и полным. Scott 5 лет назад 0
(1) Я объяснил немного лучше. Нет Заменить команду, но сделать сумму числа +1. (2) Тип, это должно быть «Доступность». Извините :) (3) Я на самом деле число может варьироваться, но это был плохой пример. Там никогда не будет ведущего нуля. (4) Я знаю, но я не могу понять это. Вот почему мне нужна твоя помощь. James 5 лет назад 0
Нет, доступность не всегда на одной линии. James 5 лет назад 0

1 ответ на вопрос

1
Paul Sweatte

Используйте 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/ Рекомендации

Похожие вопросы