【问题标题】:Perl - parse xml stored as string in a variablePerl - 解析存储为变量中的字符串的xml
【发布时间】:2017-11-06 20:49:22
【问题描述】:

我在 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。请帮忙。谢谢。

【问题讨论】:

  • 您认为在尝试此操作时收到错误消息是不值得一提的吗? 不能在没有包或对象引用的情况下调用方法“getElementsByTagName”

标签: xml perl


【解决方案1】:

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

如果您阅读XML::LibXML::Parser 的文档,它将向您展示如何将 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 文档变量(在 $doc 中),您可以在其上调用 XML::LibXML 方法。

【讨论】:

    【解决方案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');
    

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2013-01-26
      • 2010-10-13
      • 2022-01-12
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      相关资源
      最近更新 更多