php simplexml_load_file - 无法在print_r中看到

Kan*_*Stu 2 php xml simplexml xml-parsing simplexml-load-string

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

我有一个名为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>
Run Code Online (Sandbox Code Playgroud)

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

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.');  
}
Run Code Online (Sandbox Code Playgroud)

该文件存在,但我在print_r得到的是:

file exists    
SimpleXMLElement Object ( ) 
Run Code Online (Sandbox Code Playgroud)

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

谢谢

hak*_*kre 8

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

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

要查看整个XML,请改用asXML()方法.或者获取调试信息,您可以使用一个库,专门了解关于如何调试的SimpleXMLElement内容的喜欢simplexml_debugIMSOP.

在您的特定情况下,对象显示为空(没有对象成员),因为默认命名空间中的XML文档中没有任何节点(请参阅:XML 1.0中的命名空间) - 在SimpleXMLElement到数组的或多或少的复杂规则之后应用了转换 - 将从对象内部调试处理程序传递到要显示的函数print_rvar_dump函数.因此,只给出了类名,以便您可以看到它是某个类的对象 - 并且没有成员:

SimpleXMLElement Object ( ) 
        ^          ^     ^ 
   object type     |     `------ object fields (empty)
                   |
             variable type
Run Code Online (Sandbox Code Playgroud)

怎么处理?这很简单:知道XML(你知道它)并从文档中获取数据:

由于您的XML元素名称包含冒号,因此您应该知道这些是所谓的XML命名空间.正如您在print_r输出中看到的差异,您还将看到访问该命名空间中的子元素的不同之处.您必须使用该children()方法并指定要获取子元素的名称空间.如果使用该xpath()方法访问元素,则需要在您调用该方法的SimpleXMLElement上使用它之前注册名称空间前缀.

在网站上有一些选择的SimpleXML和XML Namespace相关的问答材料:

您还可以从PHP手册中获取此信息,只需查看SimpleXMLElement API文档中的命名空间相关信息即可.