以下是我要提取的xml代码' string' value macromedia.jdbc.MacromediaDriver并使用perl将其修改为NoDatabase。
文件名 - neo-datasource.xml
<?xml version="1.0"?>
-<wddxPacket version="1.0">
<header/>
-<data>
-<array length="2">
-<struct type="coldfusion.server.ConfigMap">
-<var name="CFASTSTJ">
-<struct type="coldfusion.server.ConfigMap">
-<var name="alter">
<boolean value="true"/>
</var>
-<var name="CLASS">
<string>macromedia.jdbc.MacromediaDriver</string>
</var>
</struct>
</struct>
</array>
</data>
</wddxpacket>
请任何人都可以分享您的想法或perl脚本。
答案 0 :(得分:1)
使用XML Parser很容易。像XML::Twig
一样。
例如:
#!/usr/bin/perl;
use strict;
use warnings;
use XML::Twig;
XML::Twig->new(
'pretty_print' => 'indented_a',
'twig_handlers' => {
'var[@name="CLASS"]/string' => sub { $_->set_text('NoDatabase') }
}
)->parse( \*DATA )->print;
__DATA__
<?xml version="1.0"?>
<wddxPacket version="1.0">
<header/>
<data>
<array length="2">
<struct type="coldfusion.server.ConfigMap">
<var name="CFASTSTJ">
<struct type="coldfusion.server.ConfigMap">
<var name="alter">
<boolean value="true"/>
</var>
<var name="CLASS">
<string>macromedia.jdbc.MacromediaDriver</string>
</var>
</struct>
</var>
</struct>
</array>
</data>
</wddxPacket>
这使用xpath表达式'var[@name="CLASS"]/string'
- 这意味着var
属性等于name
且子元素为CLASS
的任何元素string
。它会将此应用于与其匹配的任何实例。您可能需要更具体的xpath来存储数据。 (例如data/array/struct[@type="coldfusion.server.ConfigMap"]/var[@name="CFASTSTJ"]/struct[@type="coldfusion.server.ConfigMap"]/var[@name="CLASS"]/string
- 虽然可能有点过分:))
注意 - 我已经修复了你的XML - 我假设这是一个排版错误,而不是破坏源XML。如果您的源XML被破坏,那么您就会遇到更大的问题。
输出:
<?xml version="1.0"?>
<wddxPacket version="1.0">
<header/>
<data>
<array length="2">
<struct type="coldfusion.server.ConfigMap">
<var name="CFASTSTJ">
<struct type="coldfusion.server.ConfigMap">
<var name="alter">
<boolean value="true" />
</var>
<var name="CLASS">
<string>NoDatabase</string>
</var>
</struct>
</var>
</struct>
</array>
</data>
</wddxPacket>
答案 1 :(得分:0)
此程序使用XML::Twig
模块处理您的数据
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig->new( keep_spaces => 1 );
$twig->parsefile('neo-datasource.xml');
my ($class_string) = $twig->findnodes('//var[@name="CLASS"]/string');
$class_string->set_text('NoDatabase');
print $twig->toString;
<强>输出强>
<?xml version="1.0"?>
<wddxPacket version="1.0">
<header/>
<data>
<array length="2">
<struct type="coldfusion.server.ConfigMap">
<var name="CFASTSTJ">
<struct type="coldfusion.server.ConfigMap">
<var name="alter">
<boolean value="true"/>
</var>
<var name="CLASS">
<string>NoDatabase</string>
</var>
</struct>
</var>
</struct>
</array>
</data>
</wddxPacket>