$sub_array["firstname"] = $node->nodeValue = "";
сначала заменит все содержимое $node
пустой строкой, удалив любое содержимое.После этого он присвоит пустую строку $sub_array["firstname"]
.
И вы присваиваете один и тот же $node->nodeValue
всем различным элементам массива.Ваш код выглядит так, как будто это какая-то часть общего преобразования и какая-то конкретная часть задания.Вызов функции json2xml()
на узле DOM не имеет для меня особого смысла.
Итак, вот небольшой пример для чтения конкретного XML с помощью DOM.Использование методов DOM возможно, но с Xpath это намного проще:
$xml = <<<'XML'
<persons>
<person>
<firstname>Jane</firstname>
<lastname>Doe</lastname>
</person>
</persons>
XML;
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
$persons = [];
foreach ($xpath->evaluate('/persons/person') as $personNode) {
$persons[] = [
'firstname' => $xpath->evaluate('string(firstname)', $personNode),
'lastname' => $xpath->evaluate('string(lastname)', $personNode)
];
}
var_dump($persons);
Вывод:
array(1) {
[0]=>
array(2) {
["firstname"]=>
string(4) "Jane"
["lastname"]=>
string(3) "Doe"
}
}
Результат DOMXpath::evaluate()
зависит от выражения Xpath./persons/person
всегда будет возвращать список узлов.Если здесь нет узлов person
элемента внутри узла элемента документа persons
, он вернет пустой список.
string(firstname)
извлечет все firstname
дочерние элементы элемента предоставленного контекста ($personNode
) и преобразует первый найденный узел в строку.Если здесь нет совпадения, он вернет пустую строку.
Xpath допускает довольно сложное выражение в комбинированных и вложенных условиях.Это позволяет вам избежать большого количества сложностей (циклов) в вашем источнике PHP.