Помните, что обработка XML с помощью регулярных выражений - это обычно очень плохая идея , с Perl вы можете
#! /usr/bin/perl
use warnings;
use strict;
system("xsltproc", "fix.xsl", "input.xml") == 0
or warn "$0: xsltproc failed\n";
и с fix.xsl
из
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Configuration/Parameters/Component/Group/Parameter[@Name='MapSource']/Value/Item[@Value='NONE']">
<xsl:element name="Item">
<xsl:attribute name="Value">API</xsl:attribute>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
чтобы получить желаемый результат:
$ diff -ub input.xml <(./prog.pl)
--- input.xml
+++ /dev/fd/63
@@ -1,3 +1,4 @@
+<?xml version="1.0"?>
<Configuration>
<Parameters>
<Component Name="Aas">
@@ -82,7 +83,7 @@
<Level>5</Level>
</Restriction>
<Value>
- <Item Value="NONE"/>
+ <Item Value="API"/>
</Value>
</Parameter>
<Parameter Name="SystemsLoaderInterval">
Если вы не знакомы, <(./prog.pl)
использует подстановка процесса bash , поэтому команда diff
сравнивает input.xml
с вывод короткой Perl-программы.
Чтобы заменить все элементы Item, которые являются потомками параметров MapSource, используйте таблицу стилей ниже.Обратите внимание, как она более гибка в отношении структуры исходного документа.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="//Parameter[@Name='MapSource']//Item">
<xsl:element name="Item">
<xsl:attribute name="Value">API</xsl:attribute>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Теперь переход от ввода к выводу составляет
$ diff -ub input.xml <(./prog.pl)
--- input.xml
+++ /dev/fd/63
@@ -1,3 +1,4 @@
+<?xml version="1.0"?>
<Configuration>
<Parameters>
<Component Name="Aas">
@@ -59,7 +60,7 @@
<Level>5</Level>
</Restriction>
<Value>
- <Item Value="FILE"/>
+ <Item Value="API"/>
</Value>
</Parameter>
</Group>
@@ -82,7 +83,7 @@
<Level>5</Level>
</Restriction>
<Value>
- <Item Value="NONE"/>
+ <Item Value="API"/>
</Value>
</Parameter>
<Parameter Name="SystemsLoaderInterval">