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

随心所欲。