simplexml_load_file无法识别<dc:title>标记

时间:2015-05-26 06:04:44

标签: php html xml parsing

我正在尝试使用simplexml_load_file()加载XML文件并访问<dc:title>标记,但是当我转储加载了我的xml文件的$xml变量时,所有以{开头的标记{1}}没有显示。有没有办法告诉解析器包含它们?我应该使用不同的解析器吗?

这是我的示例文件代码:

<dc:

代码我用来检查看到的标签:

<?xml version='1.0' encoding='utf-8'?>
<package xmlns="http://www.idpf.org/2007/opf" prefix="ibooks: http://vocabulary.itunes.apple.com/rdf/ibooks/vocabulary-extensions-1.0/" unique-identifier="pub-id" version="3.0" xml:lang="en">
  <metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
    <dc:title>test</dc:title>
  </metadata>
</package>

结果:

$xml = simplexml_load_file('test.xml');
echo '<pre>';var_dump($xml);echo '</pre>';

元数据实际上是空的。想法?

1 个答案:

答案 0 :(得分:2)

首先,dc是名称空间,不是标记名称的一部分。出于测试目的,您可以打印给定xml中使用的命名空间。执行代码段

$namespaces = $xml->getNamespaces(true);
var_dump($namespaces);

将输出

array(3) {
  '' =>
  string(28) "http://www.idpf.org/2007/opf"
  'xml' =>
  string(36) "http://www.w3.org/XML/1998/namespace"
  'dc' =>
  string(32) "http://purl.org/dc/elements/1.1/"
}

您必须为命名空间注册一个前缀以供xpath使用,然后您可以将其用于选择:

$xml->registerXPathNamespace('b', 'http://purl.org/dc/elements/1.1/');
$a =$xml->xpath('//b:*/text()');
foreach($a as $t) {
   print($t."\n");
}

这将输出您想要获得的元素的test