2

试图从 xml 获取所有 URL 值。

我有数百个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);

什么是正确的查询?最好的办法是只获得url价值。

4

2 回答 2

2

您的查询可能会返回正确的元素,但默认情况下会为您提供媒体标签的内容(在您的情况下为空,因为标签是自动关闭的)。

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

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

或者你应该只是 xpath-query 属性并读出它的值:

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

请参阅DOMAttr::$value文档

价值


属性值

于 2013-03-18T17:43:51.193 回答
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这将为您提供数组内的所有 URL 作为字符串。如果加载 XML 文件时出错,则数组为空。

于 2013-03-19T10:24:02.883 回答