如何从xml文件中提取特定值并使用perl修改它?

时间:2015-06-17 12:51:53

标签: xml perl xml-parsing

以下是我要提取的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脚本。

2 个答案:

答案 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>