Xml::arrayToXml fails on nested arrays
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 65/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Estagnada
- Stack de tecnologia
- php
- Domínio
- testing-qa
Direção de pesquisa
Comece pelo helper Xml::arrayToXml e reproduza o exemplo de array aninhado da issue. Inspecione o ramo recursivo em que o elemento aninhado é passado antes de existir e, em seguida, verifique se o exemplo produz o XML aninhado esperado sem erros de PHP.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
The helper function arrayToXml has code indended to handle nested arrays, but currently always throws PHP errors. This means nested arrays can't be used when testing soap functions with array data either.
Reproduce
Code:
$dom = new \DOMDocument();
$array = [
'foo' => [
'bar' => '1'
]
];
echo \Codeception\Util\Xml::arrayToXml($dom, $dom, $array)->saveXML();
Expected output:
<?xml version="1.0"?>
<foo><bar>1</bar></foo>
Result:
Undefined property: DOMDocument::$foo
Cause
When the function encounters an array, it calls itself to parse the array, with $domNode->$el as the new $domNode parameter. The problem is that that node ->$el will never exist, since that's the node this function was supposed to create in the first place.
Fix
Create a new element first, to pass to the recursive call, and then append that new node to the xml structure.
Current code:
if (is_array($val)) {
self::arrayToXml($xml, $domNode->$el, $val);
} else {
$domNode->appendChild($xml->createElement($el, $val));
}
Fixed code:
if (is_array($val)) {
$elementNode = $xml->createElement($el);
self::arrayToXml($xml, $elementNode, $val);
$domNode->appendChild($elementNode);
} else {
$domNode->appendChild($xml->createElement($el, $val));
}
Alternatively, we could make it a little more consistent by always creating and appending the element in the same way, and only set the value inside the if-condition. That code would look like this:
$elementNode = $xml->createElement($el);
if (is_array($val)) {
self::arrayToXml($xml, $elementNode, $val);
} else {
$elementNode->nodeValue = $val;
}
$domNode->appendChild($elementNode);
Both solutions result in working code for nested arrays.
- Linguagem predominante
- PHP
- Estrelas
- 17
- Forks
- 1
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Guia de contribuição
Nenhum guia de contribuição indexado para este repositório
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de Codeception/lib-xml
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 45/100
Codeception/lib-xml#6 · 1 comentário ·
Todas as issues de Codeception/lib-xml
Issues semelhantes
-
priority: p3
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
googleapis/librarian#7636 ·
-
0. Needs triage bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
nextcloud/fulltextsearch#1011 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 84/100
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
phpstan/phpstan-doctrine#794 ·
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 74/100
Automattic/static-site-importer#1767 ·