Perl 处理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

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 = {
   '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