需要拉出2个节点并组合LibXML中的信息

时间:2013-12-27 14:36:43

标签: xml perl xml-parsing libxml2

我有一个问题,我可以肯定会使用一些帮助。首先,要温柔。我是perl和LibXML的新手。

我一直在解析文档并将元素放入一个数组中,然后写入一个speadsheet列。在Durring测试中,发现一些节点具有多个同名的子节点。我需要将每个子节点的文本组合成数组的一个元素。

xml的(非常简化的)格式是:

<Group>
    <title>
    <description>
    <reference>
    <fixtext>
    <check>
        <check-content> "Some text I want to pull"

但偶尔会是这样的:

<Group>
    <title>
    <description>
    <reference>
    <fixtext>
    <check>
        <check-content> "Some text I want to pull"
        <check-content> "Some more text I want to pull and join to the first"

我可以从“check-contents”中提取所有文本,但是如果有多个文本,它会抛弃电子表格中的数据行。我需要能说出类似的话:

如果有2个或更多“check-content”加入数据,则推入阵列。如果没有,只需将数据推入数组即可。

非常感谢任何帮助。

我一直在做的就是这个。

my @Check_Content;
my $Check_Content;
my $parser = XML::LibXML->new() or die $!;
my $doc1 = $parser->parse_file($filename1);
my $xc1 = XML::LibXML::XPathContext->new($doc1->documentElement() );
$xc1->registerNs(x => 'http://checklists.nist.gov/xccdf/1.1');

for my $Check_Content ($xc1->findnodes('//x:Group/x:Rule/x:check/x:check-content')) { 
     push (@Check_Content, $Check_Content->to_literal);
 }

1 个答案:

答案 0 :(得分:2)

您只需要处理每个check元素并为其生成check-content字符串:

for my $Check ( $xc1->findnodes('//x:Group/x:Rule/x:check') ) { 

     my $result_string;

     for my $Check_Content ( $Check->findnodes('./x:check-content') ) { 
         $result_string .= $Check_Content->to_literal;
     }

     push (@Check_Content, $result_string);
 }