2016-03-22 5 views
0

Buradaki çözümü denedim: Getting attribute using XPath ama bana bir hata veriyor.XPath 1.0'da bir özniteliğin değerini ve düğüm içindeki metni aynı anda almak mümkün mü?

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

ben yinelemeli XML ayrıştırma ve href niteliğini (link.php) ve aynı zamanda bağlantı metnini (Click me!) hem almaya çalışıyorum:

böyle bazı XHTML var. değil birlikte ayrı ayrı bu ikisinden birini yaparsanız

Warning: DOMXPath::query(): Invalid type

çalıştıkları, ancak:

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

Bu kod aşağıdaki hata atar

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

ben almak aşağıdaki özelliğini kullanıyorsanız tüm değeri (href="link.php"), yalnızca değeri değil:

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

PHP'de XPath 1.0 kullanarak metin değerlerini aynı anda almanın bir yolu var mı?

+0

onu dize haline getirdi :) - concat (a/@ href, '|', a/text()) – splash58

+0

@ splash58 Bu bana hiç eşleşme vermiyor. Ciddi bir öneri olması gerekiyordu? –

+0

Php xpaht'ın concat'ı destekleyeceğini sanmıyorum. Ayrıca bunu neden xpath (xpath gibi) ile yapmaya çalıştığınızı görmüyorum. Hepiniz doğru DomNode'a sahip görünüyorsunuz. Öyleyse neden '-> getAttribute' ve' -> node_value' kullanılmıyor? –

cevap

1

Diğerlerinin önerdiği gibi, bir öğenin özniteliği ve içeriğinin değerini birleştirmek için concat() (ve PHP XPath bunu destekler! Aşağıdaki demoya bakın) kullanabilirsiniz.

diğerleri XPath önerdi ile sorun muhtemelen şimdiki bağlam düğüme a/@href göreli vasıta href dönmek böylece bağlam düğüm ($nodes->item(0)), zaten <a> eleman olduğunu, self::a kullanımı yani sizin teşebbüs koddan yargılamak oldu öğesinin a alt öğesi öğesinin alt öğesi niteliğinin bu nedenle eşleşmemesidir. Eğer, bu durumda self::a kullanarak doğru olan ya da alternatif olarak, sadece . mevcut bağlam düğümü başvurmak için kullanılabilecek:

$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

çıkışı:

link.php|Click me!