PHP 使用 simplexml_load_string 加载 XML 文档

PHP Load XML document with simplexml_load_string

我不熟悉 XML 文件。我一直在尝试加载具有以下格式的 XML 文档,如 object 或数组: 此编辑后

<?xml version="1.0"?>
<xdm:Device xmlns:xdm="http://www.example.com/schemas/imaging/con/xdm/1.1/" 
           xmlns:dd="http://www.example.com/schemas/imaging/con/dictionaries/1.0/" 
           xmlns:bsi="http://www.example.com/schemas/imaging/con/bsi/2003/08/21" 
           xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
           xmlns:count="http://www.example.com/schemas/imaging/con/counter/2006/01/13" 
           xmlns:media="http://www.example.com/schemas/imaging/con/media/2006/01/13/" 
           xmlns:xsi="http://www.example.org/2001/XMLSchema-instance" 
           xmlns:tt="http://www.example.com/schemas/imaging/con/capabilities/1.1/" 
           xmlns:pwg="http://www.example.com/schemas/imaging/con/pwg/sm/1.0/">
    <xdm:Information>        
        <xdm:Component id="system" componentType="system">
            <dd:MakeAndModel>Samsung LaserJet ML220</dd:MakeAndModel>
            <dd:Description>Blackand while printer</dd:Description>
            <dd:ProductNumber>XB3zzz</dd:ProductNumber>
            <dd:Manufacturer>
                <dd:Name>Samsung</dd:Name>
            </dd:Manufacturer>
        </xdm:Component>
    </xdm:Information>    
</xdm:Device>

我想从每个入口获得例如 MakeAndModelDescriptionManufacturer

我目前正在尝试使用以下代码加载代码,但我已经尝试了很多东西:

$xmlString = file_get_contents('test.xml');
$xml = simplexml_load_string($xmlString); 
var_dump($xml);

我试过其他更简单的 XML 文档,效果很好。但是对于我的文档它不起作用,它加载了一个空的 object 。 该文件没有标题。我在 php.net 中阅读了其中一个示例中的以下内容:

// The file test.xml contains an XML document with a root element // and at least an element /[root]/title.

如何实现将此 XML 加载到数组或 Object?

编辑2:

当我使用示例 var_dump 中的简单 XML 文件时,输出如下:

[root@windows8 csvmail]# php ppp.php 
object(SimpleXMLElement)#1 (1) {
  ["movie"]=>
  object(SimpleXMLElement)#2 (5) {
    ["title"]=>
    string(22) "PHP: Behind the Parser"

如果得到以下内容,请修改真实文件:

[root@windows8 csvmail]# php ppp.php 
object(SimpleXMLElement)#1 (0) {
}
[root@windows8 csvmail]# 

:中的节点在"XML namespaces"中。它们用于将多种类型的数据混合到一个文件中,即使标签名称否则会发生冲突。

在文件的顶部,xmlns:... 属性将前缀(可以通过生成文件的任何内容更改)与 URL(充当特定类型数据的永久标识符)相关联。

要使用 SimpleXML 访问它们,请使用 the ->children() method 到 "select" 命名空间。您可以依靠前缀不变,或者您可以将永久标识符存储在变量或常量中,然后使用它,如下所示:

// Defining my own ways of referring to the namespaces, regardless of prefix used
define('XMLNS_HP_XDM_1_1', 'http://www.hp.com/schemas/imaging/con/xdm/1.1/');
define('XMLNS_HP_DICT_1_0', 'http://www.hp.com/schemas/imaging/con/dictionaries/1.0/');

// Load the XML in the normal way
$sx = simplexml_load_string($xml);

// Switch to the first namespace, and look at the first Component
$component = $sx->children(XMLNS_HP_XDM_1_1)->Information->Component;

// Attributes with no : in are technically in no namespace at all,
// so we have to switch back to the null namespace using attributes()
$component_id = (string)$component->attributes(null)->id;

// Switch to the second namespace to find the MakeAndModel
$make_and_model = (string)$component->children(XMLNS_HP_DICT_1_0)->MakeAndModel;

echo "$component_id : $make_and_model";

[Live Demo]

关于如何遍历多个元素,以及其他基本用法,请参阅the examples in the PHP manual