如何从xml文件中提取特定值并使用perl修改它? [英] How to extract particular value from xml file and modify it using 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
> 属性等于带有子元素 string
的 CLASS
.它将将此应用于与此匹配的任何 实例.您可能需要更具体的数据 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屋!