2016-03-22 5 views
0

私はここで解決策を試しました:Getting attribute using XPath しかし、それは私にエラーが発生します。XPath 1.0では、属性値とノード内のテキストを同時に取得できますか?

私はこのようないくつかのXHTMLあります

<a href="link.php">Click me!</a> 

を私は再帰的にXMLを解析し、同時にhref属性(link.php)とリンクテキスト(Click me!)の両方を取得しようとしています。

<?php 
$node = $xpath->query('string(self::a/@href) | self::a/text()', $nodes->item(0)); 

このコードは、次のエラーがスローされます。私は、これら2つのいずれかを行う場合は

Warning: DOMXPath::query(): Invalid type

は別に、彼らは一緒に動作しますが、ない:

<?php 
$node = $xpath->evaluate('string(self::a/@href)', $nodes->item(0)); 
$node = $xpath->query('self::a/text()', $nodes->item(0)); 

私は次のように使用している場合は、私が取得その値だけでなく、属性全体(href="link.php"):

<?php 
$node = $xpath->query('self::a/@href | self::a/text()', $nodes->item(0)); 

PHPでXPath 1.0を使用して、両方のテキスト値を同時に取得する方法はありますか?

+0

彼を文字列にする:) - concat(a/@ href、 '|'、a/text()) – splash58

+0

@ splash58それで私には全くのマッチはありません。それは真剣な提案ですか? –

+0

私はphp xpahtがconcatをサポートするとは思わない。また、私はあなたがなぜxpathでこれをやろうとしているのかわかりません(私はxpathが好きです)。あなたはすでに正しいDomNodeを持っているようです。だからなぜ ' - > getAttribute'と' - > node_value'を使わないのですか? –

答えて

1

他の人にも示唆されているように、concat()(およびそれをサポートするPHP XPath!以下のデモをご覧ください)を使用して、要素の属性とコンテンツの値を組み合わせることができます。

他の問題は、現在のコンテキストノードへa/@href相対手段はhrefを返すように、XPathはおそらく、コンテキストノード($nodes->item(0))がすでに<a>要素であることを、self::aの使用、つまり、あなたの未遂コードから判断すると、示唆しました現在の要素の子要素aという属性は一致しません。この場合にself::aを用いて正しかった、あるいは、現在のコンテキストノードを参照するために使用することができるだけ.た:

$doc = new DOMDocument(); 
$xml = <<<XML 
<root> 
<a href="link.php">Click me!</a> 
</root> 
XML; 

$doc->loadXML($xml); 
$xpath = new DOMXpath($doc); 
$nodes = $xpath->query('//a'); 

$node = $xpath->evaluate('concat(@href, "|", .)', $nodes->item(0)); 
echo $node; 

eval.in demo

出力:

link.php|Click me! 
関連する問題