Perl 我们如何用分隔符将从XML::LibXMl的FindValue中获取的值分开?

Perl 我们如何用分隔符将从XML::LibXMl的FindValue中获取的值分开?,perl,Perl,我有一个XML要解析。虽然我能够获取它们,但我不能用分隔符将它们分隔开来以便进一步处理。请告知。我的代码如下 use XML::LibXML; my $filename = 'Test.xml'; my $parser = XML::LibXML->new(); my $dom = $parser->parse_file($filename); my $root = $dom->documentElement(); my $xpc = XML::LibXML::XPathC

我有一个XML要解析。虽然我能够获取它们,但我不能用分隔符将它们分隔开来以便进一步处理。请告知。我的代码如下

use XML::LibXML;

my $filename = 'Test.xml';

my $parser = XML::LibXML->new();
my $dom = $parser->parse_file($filename);
my $root = $dom->documentElement();
my $xpc = XML::LibXML::XPathContext->new($root);

foreach my $id ($xpc->findnodes('/dataset/chapter'))
{
    print $xpc->findvalue('mono/route-list', $id);
    print join ",", $xpc->findvalue('mono/route-list', $id);
}
对于两个“打印”语句,我得到了相同的结果,尽管预期的结果是:

眼用口服局部鼻腔注射

眼科、口腔、局部、鼻腔、注射、口腔、口腔、口腔、口腔

xml文件结构如下所示:

<dataset id="5"><title>NDC 11</title>
<chapter id="9"><title>NDC 11</title>
<mono id="310694" mid="145787">
<nam>00173074200</nam>
<route-list>
    <list-set-field dbId="25413">
        <name>ophthalmic</name>
    </list-set-field>
</route-list>   
</mono>
<mono id="4128683" mid="536890">
<nam>51079020406</nam>
<route-list>
    <list-set-field dbId="25413">
        <name>oral</name>
    </list-set-field>
</route-list>
</mono>
<mono id="4128743" mid="536930">
<nam>65862007360</nam>
<route-list>
    <list-set-field dbId="25413">
        <name>topical</name>
    </list-set-field></route-list>
</mono>
<mono id="3419599" mid="469070">
<nam>49702021718</nam>
<route-list>
    <list-set-field dbId="25413">
        <name>nasal</name>
    </list-set-field>
</route-list>
</mono>
<mono id="2990346" mid="440470">
<nam>49702022118</nam>
<route-list>
    <list-set-field dbId="25413">
        <name>injection</name>
    </list-set-field>
</route-list>
</mono>
<mono id="2990347" mid="440470">
<nam>49702022144</nam>
<route-list>
    <list-set-field dbId="25413">
        <name>oral</name>
    </list-set-field>
</route-list>
</mono>
<mono id="2990357" mid="440491">
<nam>49702022248</nam>
<route-list>
    <list-set-field dbId="25413">
        <name>oral</name>
    </list-set-field>
</route-list>
</mono>
<mono id="3808911" mid="513570">
<nam>00378410591</nam>
<route-list>
    <list-set-field dbId="25413">
        <name>oral</name>
    </list-set-field>
</route-list>
</mono>
<mono id="4128724" mid="536910">
<nam>60505358306</nam>
<route-list>
    <list-set-field dbId="25413">
        <name>oral</name>
    </list-set-field>
</route-list>
</mono>
</chapter>
</dataset>
ndc11
国家数据中心11
00173074200
眼科的
51079020406
口头的
65862007360
有关时事的
49702021718
鼻腔
49702022118
注射
49702022144
口头的
49702022248
口头的
00378410591
口头的
60505358306
口头的
如果您尝试此代码(注意for循环中的最后一行):

文件说:

findvalue()

…返回结果的文字值

结果不是一个结果。一个结果是匹配标记之间的所有文本

xml在每行末尾都有一个隐藏字符:

  <route-list>\n
    <list-set-field dbId="25413">\n
        <name>ophthalmic</name>\n
    </list-set-field>\n
  </route-list>\n  
……甚至是:

CHAPTER:
for my $chapter ($xpc->findnodes('/dataset/chapter')) {
    for my $name_text ($xpc->findnodes('//mono/route-list//name/text()', $chapter)) {
        say $name_text;
        last CHAPTER;
    }
}

看起来你没有得到一个列表,而是一个字符串。@JimDavis,你好,Jim。该怎么解决呢?
  <route-list>\n
    <list-set-field dbId="25413">\n
        <name>ophthalmic</name>\n
    </list-set-field>\n
  </route-list>\n  
CHAPTER:
for my $chapter ($xpc->findnodes('/dataset/chapter')) {
    for my $name ($xpc->findnodes('//mono/route-list//name', $chapter)) {
        say $name->textContent;
        last CHAPTER;
    }
}

--output:--
ophthalmic
CHAPTER:
for my $chapter ($xpc->findnodes('/dataset/chapter')) {
    for my $name_text ($xpc->findnodes('//mono/route-list//name/text()', $chapter)) {
        say $name_text;
        last CHAPTER;
    }
}