2017-10-23 15 views
0

サンプルXML文書に上記のXML文書を解析する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); 
} 

アム、必要な子ノードは検出されません。いくつか指摘していただけますか?

+0

PSを - あなたは、名前空間のための相対URIを使用すべきではありません。 – ikegami

答えて

4

あなたはparent/child1/granchild2/v1名前空間からタイプweb-interface-classifierclassifierの要素を見つけようとしているが、あなたがnullの名前空間からタイプweb-interface-classifierclassifierの要素を見つけるために尋ねました。修正:

#!/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>