从PERL LibXML Parser获取完整的XML字符串

时间:2016-01-12 13:04:12

标签: xml perl libxml2

我正在使用我需要处理的XML

<table>
<col1>check1</col1>
<col2>check2</col2>
<col3>check3</col3>
<content>
    <data>gt1</data>
    <data>check_gt1</data>
</content>
</table>

我想从解析器中获取“<content><data>gt1</data><data>check_gt1</data></content>”。

我的解析代码如下,

my $parser = XML::LibXML->new();
my $respDom = $parser->parse_string($xmldata);
print "content is ".$respDom->getDocumentElement->findnodes("//content");

上面的代码导致节点内的textContent。如何获取上面提到的数据?

1 个答案:

答案 0 :(得分:5)

XML :: LibXML :: Node对象有a method toString。那就是你需要的。我通过快速搜索XML :: LibXML文档找到了它。

use strict;
use warnings;
use XML::LibXML;

my $xmldata = <<'XML';
<table>
<col1>check1</col1>
<col2>check2</col2>
<col3>check3</col3>
<content>
    <data>gt1</data>
    <data>check_gt1</data>
</content>
</table>
XML

my $parser = XML::LibXML->new();
my $respDom = $parser->parse_string($xmldata);
print "content is "
  . $respDom->getDocumentElement->findnodes("//content")->[0]->toString;

这将打印:

content is <content>
    <data>gt1</data>
    <data>check_gt1</data>
</content>

一般来说,我总是会搜索to_stringas_stringstringify或只是string,如果我需要这样的东西,我不确定它是如何工作的具体模块。它几乎总是其中之一。

<强>更新

要仅获取<content>元素的内部XML,您必须获取其子节点并为每个节点执行toString。需要在列表上下文中调用map整个事件,否则会引发错误。请注意我在.语句中将,更改为print的方式。

print "content is "
  , $respDom->getDocumentElement->findnodes("//content")->[0]->childNodes->map(sub {$_->toString});