PHP 将属性路径分配给变量时,simplexmlelement 找不到属性
PHP simplexmlelement fails to find attribute when attribute path is assigned to variable
我的代码解析一个数组以获取 xml 文件中各种属性的路径。我将 xml 作为简单的 xml 元素加载,如下所示:
$xml = simplexml_load_string($xml_string);
$address = $xml->response->addressinformation->records->record[0];
此代码将起作用并显示“03”的正确值:
$from = $address->{'from-date'}['month'];
echo $from;
//prints '03'
from-date
周围的 {}
是必需的,因为元素名称中有 -
。
下面的代码块看起来在功能上应该等同于上面的代码,但是当我将路径分配给 $variable 时它不起作用。
$path = "{'from-date'}['month']";
$from = $address->$path;
echo $from;
//prints ''
$path = "from-date['month']";
$from = $address->$path;
echo $from;
//prints ''
此代码可以工作。
//normal path
$from = $address->{'from-date'};
//path assigned to variable
$path = "from-date";
$from2 = $address->$path;
var_dump($from);
var_dump($from2);
//both correctly output - object(SimpleXMLElement)#1587 (1)
//{ ["@attributes"]=> array(2) { ["year"]=> string(4) "2003" ["month"]=> string(2) "03" } }
当我用 ['month']
定位特定属性时,它似乎只失败了。我知道这个问题的答案只是我做错了一些愚蠢的事情。谁能告诉我这是什么?
样本XML
$xml_string = '
<?xml version="1.0" encoding="utf-8"?>
<root>
<response>
<addressinformation>
<records>
<record id="1">
<fullname>JOHN E DOE</fullname>
<firstname>JOHN</firstname>
<middlename>E</middlename>
<lastname>DOE</lastname>
<fulldob>01/01/1970</fulldob>
<from-date year="2003" month="03"/>
<to-date year="2010" month="09"/>
</record>
<record id="2">
<fullname>JOHN E DOE</fullname>
<firstname>JOHN</firstname>
<from-date year="2003" month="03"/>
<to-date year="2010" month="09"/>
</record>
</records>
</addressinformation>
<otherinformation>
<records>
<record id="3">
<fullname>JOHN DOE</fullname>
<firstname>JOHN</firstname>
<lastname>DOE</lastname>
<fulldob>01/01/1970</fulldob>
</record>
<record id="4">
<fullname>JOHN EDWARD DOE</fullname>
<firstname>JOHN</firstname>
<middlename>EDWARD</middlename>
<lastname>DOE</lastname>
<fulldob>19700000</fulldob>
</record>
<record id="5">
<fullname>JOHN EDWARD DOE</fullname>
<firstname>JOHN</firstname>
<middlename>EDWARD</middlename>
<lastname>DOE</lastname>
<fulldob>19830000</fulldob>
</record>
</records>
</otherinformation>
</response>
</root>
';
您不能使用 "from-date['month']"
之类的东西作为元素的路径,就像您不能在普通数组中使用它一样。预计它只是数组的 1 级。
XML 的另一种选择是您可以使用 XPath 表达式(您需要学习 XPath,但如果您使用 XML,它可能会解决很多其他问题) .
你的情况...
$path = "./from-date/@month";
$from = $address->xpath($path)[0];
echo $from;
给出 03
.
XPath 行中 [0]
的原因是 xpath()
returns 一组匹配项,所以这只选择第一个。
(顺便说一句,你也不应该在 <?xml ...
之前有任何空格,所以确保你有类似
$xml_string = '<?xml version="1.0" encoding="utf-8"?>
)
你想做的事是不可能的;您只能使用变量作为您尝试访问的 属性 的名称,而不是将其作为数组引用。当您尝试使用
$path = "{'from-date'}['month']";
$from = $address->$path;
您实际上正在尝试访问名称为 {'from-date'}['month']
的对象 属性,这就是您没有得到结果的原因。
您还可以使用变量指定属性:
$path = "from-date";
$attr = 'month';
$from2 = $address->$path[$attr];
echo $from2;
这将输出
03
随心所欲。
我的代码解析一个数组以获取 xml 文件中各种属性的路径。我将 xml 作为简单的 xml 元素加载,如下所示:
$xml = simplexml_load_string($xml_string);
$address = $xml->response->addressinformation->records->record[0];
此代码将起作用并显示“03”的正确值:
$from = $address->{'from-date'}['month'];
echo $from;
//prints '03'
from-date
周围的 {}
是必需的,因为元素名称中有 -
。
下面的代码块看起来在功能上应该等同于上面的代码,但是当我将路径分配给 $variable 时它不起作用。
$path = "{'from-date'}['month']";
$from = $address->$path;
echo $from;
//prints ''
$path = "from-date['month']";
$from = $address->$path;
echo $from;
//prints ''
此代码可以工作。
//normal path
$from = $address->{'from-date'};
//path assigned to variable
$path = "from-date";
$from2 = $address->$path;
var_dump($from);
var_dump($from2);
//both correctly output - object(SimpleXMLElement)#1587 (1)
//{ ["@attributes"]=> array(2) { ["year"]=> string(4) "2003" ["month"]=> string(2) "03" } }
当我用 ['month']
定位特定属性时,它似乎只失败了。我知道这个问题的答案只是我做错了一些愚蠢的事情。谁能告诉我这是什么?
样本XML
$xml_string = '
<?xml version="1.0" encoding="utf-8"?>
<root>
<response>
<addressinformation>
<records>
<record id="1">
<fullname>JOHN E DOE</fullname>
<firstname>JOHN</firstname>
<middlename>E</middlename>
<lastname>DOE</lastname>
<fulldob>01/01/1970</fulldob>
<from-date year="2003" month="03"/>
<to-date year="2010" month="09"/>
</record>
<record id="2">
<fullname>JOHN E DOE</fullname>
<firstname>JOHN</firstname>
<from-date year="2003" month="03"/>
<to-date year="2010" month="09"/>
</record>
</records>
</addressinformation>
<otherinformation>
<records>
<record id="3">
<fullname>JOHN DOE</fullname>
<firstname>JOHN</firstname>
<lastname>DOE</lastname>
<fulldob>01/01/1970</fulldob>
</record>
<record id="4">
<fullname>JOHN EDWARD DOE</fullname>
<firstname>JOHN</firstname>
<middlename>EDWARD</middlename>
<lastname>DOE</lastname>
<fulldob>19700000</fulldob>
</record>
<record id="5">
<fullname>JOHN EDWARD DOE</fullname>
<firstname>JOHN</firstname>
<middlename>EDWARD</middlename>
<lastname>DOE</lastname>
<fulldob>19830000</fulldob>
</record>
</records>
</otherinformation>
</response>
</root>
';
您不能使用 "from-date['month']"
之类的东西作为元素的路径,就像您不能在普通数组中使用它一样。预计它只是数组的 1 级。
XML 的另一种选择是您可以使用 XPath 表达式(您需要学习 XPath,但如果您使用 XML,它可能会解决很多其他问题) .
你的情况...
$path = "./from-date/@month";
$from = $address->xpath($path)[0];
echo $from;
给出 03
.
XPath 行中 [0]
的原因是 xpath()
returns 一组匹配项,所以这只选择第一个。
(顺便说一句,你也不应该在 <?xml ...
之前有任何空格,所以确保你有类似
$xml_string = '<?xml version="1.0" encoding="utf-8"?>
)
你想做的事是不可能的;您只能使用变量作为您尝试访问的 属性 的名称,而不是将其作为数组引用。当您尝试使用
$path = "{'from-date'}['month']";
$from = $address->$path;
您实际上正在尝试访问名称为 {'from-date'}['month']
的对象 属性,这就是您没有得到结果的原因。
您还可以使用变量指定属性:
$path = "from-date";
$attr = 'month';
$from2 = $address->$path[$attr];
echo $from2;
这将输出
03
随心所欲。