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>
我想从每个入口获得例如 MakeAndModel
、Description
、Manufacturer
等
我目前正在尝试使用以下代码加载代码,但我已经尝试了很多东西:
$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";
关于如何遍历多个元素,以及其他基本用法,请参阅the examples in the PHP manual。
我不熟悉 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>
我想从每个入口获得例如 MakeAndModel
、Description
、Manufacturer
等
我目前正在尝试使用以下代码加载代码,但我已经尝试了很多东西:
$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";
关于如何遍历多个元素,以及其他基本用法,请参阅the examples in the PHP manual。