如何从xml文件中提取特定值并使用perl修改它? [英] How to extract particular value from xml file and modify it using perl?

查看:38
本文介绍了如何从xml文件中提取特定值并使用perl修改它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我想提取字符串"值 macromedia.jdbc.MacromediaDriver 并使用 perl 将其修改为 NoDatabase 的 xml 代码.

Here is the xml code where I want to extract 'string' value macromedia.jdbc.MacromediaDriver and modify it as NoDatabase using perl.

文件名-neo-datasource.xml

File name- 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 脚本.

Please anyone can share your ideas or perl script.

推荐答案

使用 XML 解析器很容易.像 XML::Twig.

It's easy enough using an XML Parser. Like 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> 属性等于带有子元素 stringCLASS.它将将此应用于与此匹配的任何 实例.您可能需要更具体的数据 xpath.(例如 data/array/struct[@type="coldfusion.server.ConfigMap"]/var[@name="CFASTSTJ"]/struct[@type="coldfusion.server.ConfigMap"]/var[@name="CLASS"]/string - 虽然这可能有点矫枉过正:))

This uses an xpath expression 'var[@name="CLASS"]/string' - which means any element var with a name attribute equal to CLASS with a subelement string. It will apply this to any instance that matches this. You may need a more specific xpath for your data. (e.g. data/array/struct[@type="coldfusion.server.ConfigMap"]/var[@name="CFASTSTJ"]/struct[@type="coldfusion.server.ConfigMap"]/var[@name="CLASS"]/string - that's probably overkill though :))

注意 - 我已经修复了您的 XML - 我假设这是一个印刷错误,而不是损坏的源 XML.如果您的源 XML 损坏,那么您将遇到更大的问题.

Note - I've fixed your XML - I'm assuming that's a typographic error, rather than broken source XML. If your source XML is broken, then you have bigger problems.

输出:

<?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>

这篇关于如何从xml文件中提取特定值并使用perl修改它?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆