2013-03-18 69 views
2

尝试从xml获取所有URL值。简单的xpath查询但没有结果

我有几百个entry正好像例如,此项16

<?xml version="1.0" encoding="utf-8" ?> 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <entries> 
    <entry id="16"> 
     <revision number="1" status="accepted" wordclass="v" nounclasses="" unverified="false"></revision> 
     <media type="audio" url="http://website.com/file/65.mp3" /> 
     </entry> 
    <entry id="17"> 
     .... 
    </entry> 
</entries> 
</root> 

我使用此代码,但不能让它开始工作。为什么?

$doc = new DOMDocument; 

$doc->Load('data.xml'); 

$xpath = new DOMXPath($doc); 

$query = '//root/entries/entry/media'; 

$entries = $xpath->query($query); 

这是什么correc查询?最好的办法是只获得url的值。

回答

2

您的查询可能会返回适当的元素,但默认情况下会为您提供媒体标记的内容(在您的情况下为空,因为标记是自闭合的)。

要获取标签的url属性,你应该使用getAttribute(),例如:

$entries = $xpath->query('//root/entries/entry/media'); 
foreach($entries as $entry) { 
    print $entry->getAttribute("url")."<br/>"; 
} 

或者你应该的XPath查询的属性,而不是读出它的价值:

$urlAttributes = $xpath->query('//root/entries/entry/media/@url'); 
                  ##### 
foreach ($urlAttributes as $urlAttribute) 
{ 
    echo $urlAttribute->value, "<br/>\n"; 
         ##### 
} 

DOMAttr::$valueDocs


属性的值

+0

谢谢。现在它可以工作。我删除了这个''当我删除这个xmlns = somepage时。有效。在没有输出之前。 – Patrick 2013-03-18 17:47:11

+2

或者使用'/ root/entries/entry/media/@ url''作为XPath来直接获取'DomAttr'节点。 – 2013-03-18 17:49:19

1

我会做到这一点用SimpleXML实际上:

$file = 'data.xml'; 
$xpath = '//root/entries/entry/media/@url'; 

$xml = simplexml_load_file($file); 
$urls = array(); 

if ($xml) { 
    $urls = array_map('strval', $xml->xpath($xpath)); 
} 

,这将给你所有的网址为$urls数组中的字符串。如果加载XML文件时出错,则该数组为空。