XML :: libxml findValue for具有名称空间前缀的属性



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

我无法从此元素提取abc:id893

<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>

我的代码正确返回所有值(nametype属性),而不是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' );是错误的

  • 我为 abc:id for CC_11尝试的每种可能性 - ????在代码中 - 是错误的。

我在这里尝试了很多事情,包括诸如ns:/@id*[local-name()="id"]

之类的事情

xml :: libxml :: xpathcontext(近年来)不必使用xml :: libxml。

registerNs功能的正确用法是给它一个前缀和URI。

在嵌套循环中使用相同的变量没有任何意义,尤其是如果您在任何地方都不使用外部变量。

您可以使用加入来避免重复对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';
}

相关内容

  • 没有找到相关文章

最新更新