Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl-解析变量中存储为字符串的xml_Xml_Perl - Fatal编程技术网

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

Perl-解析变量中存储为字符串的xml,xml,perl,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>

我在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;
使用严格;
使用警告;
使用XML::LibXML;
my$xml=“25502212”;
my$id=$xml->getElementsByTagName(“id”)->item(0)->getFirstChild->getData;
打印$id;

在本例中,我无法打印ID。请帮助。谢谢。

您似乎误解了对象和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;
我的$xml=“…”;
我的$xml\u parser=xml::LibXML->new;
my$doc=$xml\u解析器->解析字符串($xml);

现在您有了一个XML文档变量(在
$doc
中),您可以在该变量上调用XML::LibXML方法。

您编写的代码将使用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;
如果您希望在XML方面做很多工作,那么您应该熟悉XPath。在它的帮助下,上述作业可以写成

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

你不认为值得一提的是,当你尝试这样做时,你收到了一条错误消息?没有包或对象引用,无法调用方法“getElementsByTagName”
my ($family_id) = $doc->findnodes('/family/id');