具有名称空间前缀的属性的XML :: LibXML findvalue

时间:2017-12-07 16:38:29

标签: xml perl xml-libxml

我正在使用一些问题 XML::LibXML 使用命名空间。我之前使用名称空间解析了文件,但这个文件有点不同,因为它是用xlmns:abc而不是xlmns定义的。

我无法从此元素

中提取893的{​​{1}}值
abc:id

示例数据

<element name='THEFIELD' type='string' abc:id='893' minOccurs='0' maxOccurs='1'>

我的代码正确返回所有值(<schema xmlns:abc="http://www.example.com/schemas/abc" targetNamespace="http://example.com/schemas/product" elementFormDefault="qualified"> <TheType name='MyName'> <sequence> <element name='THEFIELD' type='string' abc:id='893' minOccurs='0' maxOccurs='1'> <annotation><documentation>Identifier - Realtime</documentation></annotation> </element> name属性)但不是type

abc:id

我的想法是

  • #!/usr/bin/perl use 5.010; use strict; use warnings; use XML::LibXML; use XML::LibXML::XPathContext; my $filename = '/schema.xml'; my $dom = XML::LibXML->load_xml( location => $filename ); my $xpc = XML::LibXML::XPathContext->new( $dom ); $xpc->registerNs( 'ns', 'abc:http://www.example.com/schemas/abc' ); foreach my $title ( $xpc->findnodes( '//schema' ) ) { foreach my $title ( $xpc->findnodes( '//TheType[@name="MyName"]/sequence/element' ) ) { say $title->findvalue( './@name' ), '|', $title->findvalue( '??????' ), '|', $title->findvalue( './@type' ); } } 错误

  • 我为$xpc->registerNs( 'ns', 'abc:http://www.example.com/schemas/abc' ); findvalue尝试的每一种可能性 - 代码中abc:id都是错误的。

我在这里做了很多事情,包括????ns:/@id

之类的事情

1 个答案:

答案 0 :(得分:4)

XML::LibXML::XPathContext不必使用(近年来),它已加载XML::LibXML

registerNs函数的正确用法是为它提供前缀和URI。

对嵌套循环使用相同的变量是没有意义的,特别是如果你不在任何地方使用外部变量。

您可以使用join来避免重复调用findvalue

#!/usr/bin/perl
use strict;
use warnings;
use feature qw{ say };

use XML::LibXML;

my $filename = shift;
my $dom = 'XML::LibXML'->load_xml(location => $filename);

my $xpc = 'XML::LibXML::XPathContext'->new($dom);
$xpc->registerNs(abc => 'http://www.example.com/schemas/abc');

for my $title ($xpc->findnodes('//TheType[@name="MyName"]/sequence/element')) {
    say join '|', map $title->findvalue($_), '@name', '@abc:id', '@type';
}