My XML file looks like this:
<Configuration>
<Parameters>
<Component Name="Aas">
<Group Name="PrivilegesMapping">
<Parameter Name="PrivilegesLoaderInterval">
<Description>
The interval (in minute)
</Description>
<Type>Integer</Type>
<Restriction>
<RequiresRestart>true</RequiresRestart>
<MinVal/>
<MaxVal/>
<MaxLength/>
<Mandatory>true</Mandatory>
<Lov/>
<Level>5</Level>
</Restriction>
<Value>
<Item Value="5"/>
</Value>
</Parameter>
</Group>
<Group Name="DomainsMapping">
<Parameter Name="DomainLoaderInterval">
<Description>
The interval (in minute)
</Description>
<Type>Integer</Type>
<Restriction>
<RequiresRestart>true</RequiresRestart>
<MinVal/>
<MaxVal/>
<MaxLength/>
<Mandatory>true</Mandatory>
<Lov/>
<Level>5</Level>
</Restriction>
<Value>
<Item Value="5"/>
</Value>
</Parameter>
<Parameter Name="MapSource">
<Description>
Set the source of the domains list
</Description>
<Type>Enum</Type>
<Restriction>
<RequiresRestart>true</RequiresRestart>
<MinVal/>
<MaxVal/>
<MaxLength/>
<Mandatory>true</Mandatory>
<Lov>
<Val>FILE</Val>
<Val>DATABASE</Val>
<Val>NONE</Val>
</Lov>
<Level>5</Level>
</Restriction>
<Value>
<Item Value="FILE"/>
</Value>
</Parameter>
</Group>
<Group Name="SystemsMapping">
<Parameter Name="MapSource">
<Description>
</Description>
<Type>Enum</Type>
<Restriction>
<RequiresRestart>true</RequiresRestart>
<MinVal/>
<MaxVal/>
<MaxLength/>
<Mandatory>true</Mandatory>
<Lov>
<Val>API</Val>
<Val>FILE</Val>
<val>NONE</Val>
</Lov>
<Level>5</Level>
</Restriction>
<Value>
<Item Value="NONE"/>
</Value>
</Parameter>
<Parameter Name="SystemsLoaderInterval">
<Description>
The interval (in minute)
</Description>
<Type>Integer</Type>
<Restriction>
<RequiresRestart>true</RequiresRestart>
<MinVal/>
<MaxVal/>
<MaxLength/>
<Mandatory>true</Mandatory>
<Lov/>
<Level>5</Level>
</Restriction>
<Value>
<Item Value="5"/>
</Value>
</Parameter>
</Group>
</Component>
</Parameters>
</Configuration>
I’d like to change value from <Item Value="NONE"/> to <Item Value="API"/> under <Parameter Name="MapSource">.
Remembering that processing XML with regular expressions is usually a really bad idea, with Perl you could
and with
fix.xslofto get the desired result:
$ 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">In case you aren’t familiar,
<(./prog.pl)uses bash process substitution, so thediffcommand is comparinginput.xmlwith the output of the short Perl program.To replace all Item elements that are descendants of MapSource parameters, use the stylesheet below. Note how it’s more flexible about the structure of the source document.
Now the change from input to output is
$ 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">