php simplexml_load_file - 无法在print_r

时间:2015-08-09 05:57:29

标签: php xml xml-parsing simplexml simplexml-load-string

我是PHP新手simplexml parser。我已经运行了我找到的示例,它们的工作方式与广告一致。我不能让它与我的程序一起工作。我在这里搜了好几个小时。

我有一个名为core.xml的XML文件(注意节点标签中有冒号):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <dc:title>Lecture 3</dc:title>
    <dc:creator>John Brown &amp; Greg Smith</dc:creator>
    <cp:lastModifiedBy>Greg Smith</cp:lastModifiedBy>
    <cp:revision>165</cp:revision>
    <dcterms:created xsi:type="dcterms:W3CDTF">2010-02-19T04:37:55Z</dcterms:created>
    <dcterms:modified xsi:type="dcterms:W3CDTF">2014-01-30T02:41:30Z</dcterms:modified>

</cp:coreProperties>

我使用以下代码将其加载到解析器中:

if (file_exists('core.xml')){

    echo 'file exists <br>';
    $xml_core = simplexml_load_file('core.xml');

    print_r($xml_core);
} 
else 
{    
   exit('Failed to open core.xml.');  
}

该文件存在,但我在print_r的所有内容是:

file exists    
SimpleXMLElement Object ( ) 

如何访问节点?我必须使用的其他XML文件有很多层。

由于

2 个答案:

答案 0 :(得分:7)

您在问题中描述的错误模式实际上是正确的行为,而不是错误。

如果您在 SimpleXMLElement 上使用print_r(或var_dump),它只会向您显示有关该对象的一些基本信息 XML文档的整个内容

要查看整个XML,请改用the asXML() method。或者,为了获得调试信息,您可以使用专门了解如何调试 SimpleXMLElement 内容的库,例如simplexml_debug编写的IMSop

在您的特定情况下,对象显示为空(没有对象成员),因为默认命名空间中的XML文档中没有任何节点(请参阅:Namespaces in XML 1.0) - 在{{3之后 - 已经从对象内部调试处理程序传递到print_rvar_dump函数然后显示。因此,只给出了类名,以便您可以看到它是某个类的对象 - 并且没有成员:

SimpleXMLElement Object ( ) 
        ^          ^     ^ 
   object type     |     `------ object fields (empty)
                   |
             variable type

如何处理?它非常简单:了解XML(你知道它)并从中获取数据:

由于您的XML元素名称包含冒号,因此您应该知道这些名称是PHP: Basic SimpleXML usage - Manual。正如您在print_r输出中看到的差异一样,您还会看到访问该命名空间中的子元素的不同之处。您必须使用XML namespaces并指定要获取子元素的名称空间。如果使用xpath()方法访问元素,则需要在 SimpleXMLElement 上调用该方法之前注册名称空间前缀。

在网站上点击了一些选择的SimpleXML和XML命名空间相关的Q&amp; A材料

您也可以从PHP手册中获取此信息,只需查看Parse XML namespaces with php SimpleXML中与命名空间相关的信息。

答案 1 :(得分:0)

您可以使用file_get_contents加载XML文件。

尝试

if(file_exists('core.xml'))
{
    echo 'file exists <br>';
    $xml_core = file_get_contents('core.xml');
    $xml = new SimpleXMLElement($xml_core);
    print_r($xml);
}
else 
{
   exit('Failed to open core.xml.');
}