Perl 处理XML中带引号的字符串
Perl版本:Perl,v5.10.1(*)为x86_64-linux-thread-multi构建 我是perl的新手。我试过研究各种用于Perl的XML处理实用程序,包括XML::Simple、XML::Parser、XML::LibXML、XML::DOM、XML::XML::Twig、XML::XPath等 我试图处理一些在值部分有引号的XML。我特别希望从下面的XML中提取标题,但是,我已经在这个问题上绊倒了一点,如果可能的话,我将非常感谢您的帮助Perl 处理XML中带引号的字符串,perl,Perl,Perl版本:Perl,v5.10.1(*)为x86_64-linux-thread-multi构建 我是perl的新手。我试过研究各种用于Perl的XML处理实用程序,包括XML::Simple、XML::Parser、XML::LibXML、XML::DOM、XML::XML::Twig、XML::XPath等 我试图处理一些在值部分有引号的XML。我特别希望从下面的XML中提取标题,但是,我已经在这个问题上绊倒了一点,如果可能的话,我将非常感谢您的帮助 $VAR1 = { 'issu
$VAR1 = {
'issue' => {
'priority' => {
'fid' => '11',
'content' => '3 - Best Effort'
},
'transNum' => {
'fid' => '2',
'content' => '170'
},
'dueDate' => {
'fid' => '17',
'content' => '1327944695'
},
'status' => {
'fid' => '18',
'content' => 'Open - Unassigned'
},
'createdBy' => {
'fid' => '15',
'content' => '32'
},
'title' => {
'fid' => '20',
'content' => 'Testing on spider - issue with "quotation marks"'
},
'description' => {
'fid' => '22',
'content' => 'Noticed issue with title having quotes in title'
},
'issueNum' => {
'fid' => '1',
'content' => '33'
}
}
};
使用XML::LibXML和以下代码(注意:如果打印$issueXML变量的内容,请参见上文):
这将打印出:
<?xml version="1.0" encoding="utf-8"?>
<issues>
<issue>
<issueNum fid="1">33</issueNum>
<transNum fid="2">170</transNum>
<createdBy fid="15">32</createdBy>
<status fid="18">Open - Unassigned</status>
<title fid="20">Testing on spider - issue with "quotation marks"</title>
<priority fid="11">3 - Best Effort</priority>
<description fid="22">Noticed issue with submission of Documentation issue #40 on accurev with quotes in title. </description>
<dueDate fid="17">1327944695</dueDate>
</issue>
</issues>
33
170
32
开放-未分配
spider测试-带有“引号”的问题
3-尽力而为
注意到accurev上提交的文件问题#40,标题中有引号。
1327944695
我希望专门提取title标记的值。
当我使用XML::Parser进行处理时,我总是以最后的引号结束。我希望保留要显示的字符串的相同格式:spider测试-带有“引号”的问题 目前我对各种XML处理功能有点不知所措。我已经试了一段时间想弄明白这一点,现在我正在认真地转动我的轮子 蒂亚,谢谢你的帮助 问候,,
斯科特我不确定你在引号上遇到了什么问题。它们只是一个字符,与其他任何字符一样,除了在属性值中,如果引号已用作值分隔符,则可能必须使用实体。您确定“问题”不仅仅在于Data::Dumper显示XML::Simple生成的数据结构的方式吗 在任何情况下,都不要使用太低级的XML::Parser,使用XML::LibXML或XML::Twig。Simple似乎产生了大量的问题,特别是来自不熟悉Perl的人,所以我不确定它是否是正确的工具 这是一个使用XML::Twig的解决方案,但是还有其他方法可以做到这一点,具体取决于您想要对标题做什么
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $issueXML=q{<?xml version="1.0" encoding="utf-8"?>
<issues>
<issue>
<issueNum fid="1">33</issueNum>
<transNum fid="2">170</transNum>
<createdBy fid="15">32</createdBy>
<status fid="18">Open - Unassigned</status>
<title fid="20">Testing on spider - issue with "quotation marks"</title>
<priority fid="11">3 - Best Effort</priority>
<description fid="22">Noticed issue with submission of Documentation issue #40 on accurev with quotes in title. </description>
<dueDate fid="17">1327944695</dueDate>
</issue>
</issues>
};
my $t= XML::Twig->new( twig_handlers => { title => sub { print $_->text, "\n"; } })
->parse( $issueXML);
#/usr/bin/perl
严格使用;
使用警告;
使用XML::Twig;
我的$issueXML=q{
33
170
32
开放-未分配
spider测试-带有“引号”的问题
3-尽力而为
注意到accurev上提交的文件问题#40,标题中有引号。
1327944695
};
my$t=XML::Twig->new(Twig\u处理程序=>{title=>sub{print$\->text,“\n”;})
->解析($issueXML);
我不确定您在使用引号时遇到了什么问题。它们只是一个字符,与其他任何字符一样,除了在属性值中,如果引号已用作值分隔符,则可能必须使用实体。您确定“问题”不仅仅在于Data::Dumper显示XML::Simple生成的数据结构的方式吗
在任何情况下,都不要使用太低级的XML::Parser,使用XML::LibXML或XML::Twig。Simple似乎产生了大量的问题,特别是来自不熟悉Perl的人,所以我不确定它是否是正确的工具
这是一个使用XML::Twig的解决方案,但是还有其他方法可以做到这一点,具体取决于您想要对标题做什么
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
my $issueXML=q{<?xml version="1.0" encoding="utf-8"?>
<issues>
<issue>
<issueNum fid="1">33</issueNum>
<transNum fid="2">170</transNum>
<createdBy fid="15">32</createdBy>
<status fid="18">Open - Unassigned</status>
<title fid="20">Testing on spider - issue with "quotation marks"</title>
<priority fid="11">3 - Best Effort</priority>
<description fid="22">Noticed issue with submission of Documentation issue #40 on accurev with quotes in title. </description>
<dueDate fid="17">1327944695</dueDate>
</issue>
</issues>
};
my $t= XML::Twig->new( twig_handlers => { title => sub { print $_->text, "\n"; } })
->parse( $issueXML);
#/usr/bin/perl
严格使用;
使用警告;
使用XML::Twig;
我的$issueXML=q{
33
170
32
开放-未分配
spider测试-带有“引号”的问题
3-尽力而为
注意到accurev上提交的文件问题#40,标题中有引号。
1327944695
};
my$t=XML::Twig->new(Twig\u处理程序=>{title=>sub{print$\->text,“\n”;})
->解析($issueXML);
我通常用于XML操作。您的问题简化为:
open FILE.xml ;
for //title echo (.) ;
我通常使用XML进行操作。您的问题简化为:
open FILE.xml ;
for //title echo (.) ;
另一个也可以。文本节点内的引号应该没有问题
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
use Data::Dumper;
my $xml = XML::LibXML->load_xml(string => q{<?xml version="1.0" encoding="utf-8"?>
<issues>
<issue>
<issueNum fid="1">33</issueNum>
<transNum fid="2">170</transNum>
<createdBy fid="15">32</createdBy>
<status fid="18">Open - Unassigned</status>
<title fid="20">Testing on spider - issue with "quotation marks"</title>
<priority fid="11">3 - Best Effort</priority>
<description fid="22">Noticed issue with submission of Documentation issue #40 on accurev with quotes in title. </description>
<dueDate fid="17">1327944695</dueDate>
</issue>
</issues>
});
my $title = $xml->find('/issues/issue/title');
print $title->get_node(0)->textContent;
#/usr/bin/perl
严格使用;
使用警告;
使用XML::LibXML;
使用数据::转储程序;
my$xml=xml::LibXML->load\uxml(字符串=>q{
33
170
32
开放-未分配
spider测试-带有“引号”的问题
3-尽力而为
注意到accurev上提交的文件问题#40,标题中有引号。
1327944695
});
我的$title=$xml->find('/issues/issue/title');
打印$title->get_节点(0)->textContent;
另一个搭配。文本节点内的引号应该没有问题
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
use Data::Dumper;
my $xml = XML::LibXML->load_xml(string => q{<?xml version="1.0" encoding="utf-8"?>
<issues>
<issue>
<issueNum fid="1">33</issueNum>
<transNum fid="2">170</transNum>
<createdBy fid="15">32</createdBy>
<status fid="18">Open - Unassigned</status>
<title fid="20">Testing on spider - issue with "quotation marks"</title>
<priority fid="11">3 - Best Effort</priority>
<description fid="22">Noticed issue with submission of Documentation issue #40 on accurev with quotes in title. </description>
<dueDate fid="17">1327944695</dueDate>
</issue>
</issues>
});
my $title = $xml->find('/issues/issue/title');
print $title->get_node(0)->textContent;
#/usr/bin/perl
严格使用;
使用警告;
使用XML::LibXML;
使用数据::转储程序;
my$xml=xml::LibXML->load\uxml(字符串=>q{
33
170
32
开放-未分配
spider测试-带有“引号”的问题
3-尽力而为
注意到accurev上提交的文件问题#40,标题中有引号。
1327944695
});
我的$title=$xml->find('/issues/issue/title');
打印$title->get_节点(0)->textContent;
从XML中提取位的最佳方法是使用查询
在本例中,您正在查找元素“title”,在元素“issue”中,在元素“issues”中
因此,XPath查询只是“//issues/issue/title”
在两行代码中,您可以使用XML::LibXML::XPathContext为您执行XPath查询,该查询将返回您正在查找的元素内容
此代码片段将演示执行XPath查询的简单方法。重要的一点是注释“此处的相关位”后面的两行
有关详细信息,请参阅
#/usr/bin/perl
严格使用;
使用警告;
使用XML::LibXML;
my$xml=xml::LibXML->load\uxml(字符串=>q{
33
170
32
开放-未分配
spider测试-带有“引号”的问题
3-尽力而为
注意到accurev上提交的文件问题#40,标题中有引号。
1327944695
});
#这里的相关位
我的$xc=XM