代码之家  ›  专栏  ›  技术社区  ›  madmatrix

XML::解析-无法检测子节点

  •  0
  • madmatrix  · 技术社区  · 7 年前

    示例XML文档

    <?xml version="1.0" encoding="UTF-8"?>
    <web-interface-classifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:noNamespaceSchemaLocation="WEB-INTERFACE-GROUP-CLASSIFIER.xsd" xmlns="parent/child1/granchild2/v1">
      <classifier>
          <key1>somevalue</key1>
      </classifier>
      <classifier>
          <key2>somevalue</key2>
      </classifier>
    </web-interface-classifier>
    

    用于解析上述XML文档的代码。

    my $dom = XML::LibXML->load_xml(location => $filename);        
    my $xpc = XML::LibXML::XPathContext->new();
    $xpc->registerNs( xsi => "http://www.w3.org/2001/XMLSchema-instance" );
    
    foreach my $node ($xpc->findnodes("web-interface-classifier/classifier", $dom)) {
        print Dumper($node);
    }
    

    我试图解析XML文档并从“分类器”节点转储所需的键值对,但未检测到所需的子节点。你能提供一些建议吗?

    1 回复  |  直到 7 年前
        1
  •  4
  •   ikegami    7 年前

    您正在尝试查找类型的元素 web-interface-classifier classifier parent/child1/granchild2/v1 命名空间,但您要求查找类型为的元素 web界面分类器 分类器 来自空命名空间。固定的:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    use v5.10;
    
    use Data::Dumper;
    use XML::LibXML;
    use XML::LibXML::XPathContext;
    
    my $dom = XML::LibXML->load_xml( IO => \*DATA );
    
    my $xpc = XML::LibXML::XPathContext->new();
    $xpc->registerNs( u => "parent/child1/granchild2/v1" );
    
    for my $node ( $xpc->findnodes( "//u:web-interface-classifier/u:classifier", $dom ) ) {
        say $node->toString();
    }
    
    __DATA__
    <?xml version="1.0" encoding="UTF-8"?>
    <web-interface-classifier xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:noNamespaceSchemaLocation="WEB-INTERFACE-GROUP-CLASSIFIER.xsd" xmlns="parent/child1/granchild2/v1">
      <classifier>
          <key1>somevalue</key1>
      </classifier>
      <classifier>
          <key2>somevalue</key2>
      </classifier>
    </web-interface-classifier>
    

    <classifier>
          <key1>somevalue</key1>
      </classifier>
    <classifier>
          <key2>somevalue</key2>
      </classifier>