1

これは私にとって非常に初心者かもしれませんが、私は Perl LibXML (および XPath について) の初心者です。私はこのXML文書を持っています:

<Tims
    xsi:schemaLocation="http://my.location.com/namespace http://my.location.com/xsd/Tims.xsd"
    xmlns="http://my.location.com/namespace"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink">
        <Error>Too many entities for operation.  Acceptable limit is 5,000 and 8,609 were passed in.</Error>
        <Timestamp>2012-07-27T12:06:24-04:00</Timestamp>
        <ExecutionTime>41.718</ExecutionTime>
</Tims>

私がしたいのは、 の値を取得することだけです<Error>。それで全部です。私は多くのアプローチを試しましたが、最近ではこれです。私はドキュメントを徹底的に読みました。これは私が現在私のコードに持っているものです:

#!/usr/bin/perl -w

my $xmlString = <<XML;
<?xml version="1.0" encoding="ISO-8859-1"?>
<Tims
    xsi:schemaLocation="http://my.location.com/namespace http://my.location.com/xsd/Tims.xsd"
    xmlns="http://my.location.com/namespace"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink">
    <Error>Too many entities for operation.  Acceptable limit is 5,000 and 8,609 were passed in.</Error>
    <Timestamp>2012-07-27T12:06:24-04:00</Timestamp>
    <ExecutionTime>41.718</ExecutionTime>
</Tims>
XML

use XML::LibXML;

my $parser = XML::LibXML->new();
my $doc = $parser->parse_string($xmlString);
my $root = $doc->documentElement();
my $xpc = XML::LibXML::XPathContext->new($root);

$xpc->registerNs("x", "http://my.location.com/namespace");

foreach my $node ($xpc->findnodes('x:Tims/x:Error')) {
        print $node->toString();
}

アドバイス、リンク、何でも大歓迎です。ありがとう。

4

2 に答える 2

2

/XPathの先頭に(つまり)を追加するだけfindnodesです。

于 2012-07-27T16:49:42.777 に答える
0

<Tims>XPath コンテキストを作成するときにドキュメント要素をコンテキスト ノードとして使用しているため、コードが機能していません$xpc。要素は thisの<Error>直接の子であるため、記述する必要があるのは

$xpc->findnodes('x:Error')

または、ドキュメント ルートからのパスを指定する絶対 XPath を使用することもできます。

$xpc->findnodes('/x:Tims/x:Error')

そうすれば、コンテキストノードが何であるかは問題ではありません$xpc

しかし、適切な方法は、要素ノードを取得することを完全に忘れて、ドキュメント ルートをコンテキスト ノードとして使用することです。囲みタグなしでエラー メッセージのテキストを取得するfindvalue代わりに使用することもできます。findnodes

my $parser = XML::LibXML->new;
my $doc = $parser->parse_string($xmlString);

my $xpc = XML::LibXML::XPathContext->new($doc);
$xpc->registerNs('x', 'http://my.location.com/namespace');

my $error= $xpc->findvalue('x:Tims/x:Error');
print $error, "\n";

出力

Too many entities for operation.  Acceptable limit is 5,000 and 8,609 were passed in.
于 2012-07-28T00:43:07.287 に答える