我在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。请帮忙。感谢。
答案 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');