Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia pessoal,
estou tendo problema em recuperar um atributo de um elemento de dentro de um arquivo .xml, não sei se é a versão do php, pois o mesmo código e usado na minha máquina e no servidor e ambas usam linux como SO, a unica coisa que é diferente é a versão do php (servidor 5.1 e minha máquina 5.2.3).
$xml = file_get_contents('caminho/arquivo/valida.xml');
$xmlObj = simplexml_load_string($xml, NULL, LIBXML_NOERROR | LIBXML_NOWARNING);
dando um echo '<pre>'; var_dump($xmlObj);
ele retorna assim: (FORMA CORRETA), com o atributo name
object(SimpleXMLElement)#4 (1) {
["field"]=>
array(2) {
[0]=>
object(SimpleXMLElement)#5 (2) {
["@attributes"]=>
array(1) {
["name"]=>
string(4) "user"
}
["required"]=>
string(24) "Informe o campo Usuário"
}
[1]=>
object(SimpleXMLElement)#6 (2) {
["@attributes"]=>
array(1) {
["name"]=>
string(8) "password"
}
["required"]=>
string(21) "Informe o campo Senha"
}
}
}
Mas no servidor ele envia desta forma (não tem o atributo name)
object(SimpleXMLElement)#4 (1) {
["field"]=>
array(2) {
[0]=>
object(SimpleXMLElement)#5 (1) {
["required"]=>
string(24) "Informe o campo Usuário"
}
[1]=>
object(SimpleXMLElement)#6 (1) {
["required"]=>
string(21) "Informe o campo Senha"
}
}
}
Meu arquivo xml está assim:
<?xml version="1.0" encoding="iso-8859-1"?>
<validation>
<field name="user">
<required>Informe o campo Usuário</required>
</field>
<field name="password">
<required>Informe o campo Senha</required>
</field>
</validation>
Alguém sabe como resolver isso? Porque não retorna o atributo name ? :(
Oi Andrey, então vou ter que reescrever a classe inteira usando o $DOMDocument, uma pergunta, agora fica dando erro falando que não existe o método ->load(), você sabe o pq ? Estou achando que é alguma coisa do php ou ta falando alguma biblioteca não é possivel :(
Fatal error: Call to a member function load() on a non-object in /opt/lampp/htdocs/atendimento/util/validation.php on line 25
A linha 25 é essa:
>
$DOMDocument = new DOMDocument( '1.0', 'utf-8' );
$DOMDocument->preserveWhiteSpace = false;
$DOMDOcument->load( $xmlFile );
echo $DOMDocument->getElementsByTagName( 'field' )->item( 0 )->getAttribute( 'name' ).'<br>';O Nome da variável tá errada, não é:
$DOMDOcument->load( $xmlFile );
Troque por:
$DOMDocument->load( $xmlFile );
$xmlFile é algum file_get_contents ? se for, não precisa dele .. o load já abre o arquivo e recupera seu conteúdo
Então Andrey deu certo, kkkk
Não sei se é a melhor forma de se fazer + eu resgatei os valores assim, não sei se está certo:
$xmlFile = 'arquivo.xml';
$dom = new DOMDocument();
$dom->load($xmlFile);
$validation = $dom->getElementsByTagName( 'validation' );
$qtdField = $dom->getElementsByTagName( 'field' )->length;
for($i=0; $i<$qtdField; $i++){
foreach($validation as $field)
echo $field->getElementsByTagName( 'field' )->item( $i )->getAttribute( 'name' ).'<br>';
}
// Saída
user
password
O xml
<?xml version="1.0" encoding="iso-8859-1"?>
<validation>
<field name="user">
<required>Informe o campo Usuário</required>
</field>
<field name="password">
<required>Informe o campo Senha</required>
</field>
</validation>
No caso eu estou retornando o atributo do elemento field, como eu faria para retorna o valor 'required' dele ? :(
Você quem sabe .. pode fazer também:
<?php
$DOMDocument = new DOMDocument( '1.0', 'utf-8' );
$DOMDocument->load( 'arquivo.xml' );
$DOMXPath = new DOMXPath( $DOMDocument );
foreach( $DOMXPath->query( './/field' ) as $Nodes ){
$Atributos[] = $Nodes->getAttribute( 'name' );
foreach( $Nodes->childNodes as $Node ){
$Elemento[ $Node->nodeName ] = $Node->nodeValue;
}
$Elementos[] = $Elemento;
}
echo '<pre>', var_dump( $Atributos, $Elementos );
Olá, use DOM Document André, é bem melhor e mais fácil: