Perl - 将xml存储为变量中的字符串

时间:2017-11-06 10:13:31

标签: xml perl

我在google上做了很多搜索,但如果XML包含在字符串中,有没有办法解析并获取类似于从文件中提取值的值。

以下是示例脚本:

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

my $xml  = "<family><id>25502</id><father><id>1</id></father><mother><id>2</id></mother><son><id>2</id></son></family>";

my $id = $xml->getElementsByTagName("id")->item(0)->getFirstChild->getData;

print $id;

在此示例中,我无法打印ID。请帮忙。感谢。

2 个答案:

答案 0 :(得分:7)

您似乎误解了对象和XML解析的工作原理。你不能只使用一个模块,并突然希望它对你程序中的所有变量产生影响。

如果您阅读XML::LibXML::Parser的文档,它将向您展示如何将XML字符串解析为文档对象,然后您可以使用各种方法进行查询。

您需要这样的代码:

META-INF/context.xml

您现在拥有一个XML文档变量(在use strict; use warnings; use XML::LibXML; my $xml = '<family> ... </family>'; my $xml_parser = XML::LibXML->new; my $doc = $xml_parser->parse_string($xml); 中),您可以在其上调用XML :: LibXML方法。

答案 1 :(得分:2)

您的代码将使用 Dave Cross 描述的修复程序,但它可以更加简洁

我推荐这样的东西。请注意,在列表上下文中调用时,getChildrenByTagName会返回XML::LibXML::Node个对象的列表,而不是一个XML::LibXML::NodeList个对象。这同样适用于返回节点列表的任何方法。

use strict;
use warnings;
use feature 'say';

use XML::LibXML;

my $xml = <<__END_XML__;
<family>
    <id>25502</id> 
    <father>
        <id>1</id>
    </father>
    <mother>
        <id>2</id>
    </mother>
    <son>
        <id>2</id>
    </son>
</family>
__END_XML__

my $doc = XML::LibXML->load_xml( string => $xml );

my ($family_id) = $doc->documentElement->getChildrenByTagName('id');

say $family_id->textContent;

输出

25502

如果您希望使用XML做很多工作,那么您应该熟悉XPath。在其帮助下,上述作业可以写成

my ($family_id) = $doc->findnodes('/family/id');