Como modificar o ficheiro xml com o PHP

quero modificar o meu ficheiro xml em PHP com base nos seguintes critérios.

a minha estrutura xml parece-se com esta:

<?xml version="1.0" encoding="ISO-8859-1" ?> 

<markers>
   <marker>
      <type></type>
      <title></title>
      <address></address>
      <latitude></latitude>
      <longitude></longitude>
   <marker>
   <marker>
      <type></type>
      <title></title>
      <address></address>
      <latitude></latitude>
      <longitude></longitude>
   <marker>
</markers>

Agora sempre que o xml vai modificar, com o atributo type.

significa que, na cadeia de busca da primeira vez = "Hotéis", Então os dados relacionados com hotéis serão armazenados em arquivo xml como o formato acima.

Agora, quando mais uma vez for feita a busca por Hotéis, irá remover os elementos que têm elementos filhos com hotéis de valor.

and search for uma consulta diferente para, por exemplo, escolas é feita nessa altura, os dados relacionados com as escolas são anexados ao ficheiro xml. com os dados dos hotéis.

Agora, mais uma vez, a procura de Escolas é feita, então irá remover o elemento relacionado com as escolas.

Obrigado antecipadamente.

 14
Author: Avinash, 2009-07-28

2 answers

Pode utilizar o DOMDocument de PHP .

Você carrega o seu ficheiro e em laço através do childNodes do documento.

<?php
$dom=new DOMDocument();
$dom->load("file.xml");

$root=$dom->documentElement; // This can differ (I am not sure, it can be only documentElement or documentElement->firstChild or only firstChild)

$nodesToDelete=array();

$markers=$root->getElementsByTagName('marker');

// Loop trough childNodes
foreach ($markers as $marker) {
    $type=$marker->getElementsByTagName('type')->item(0)->textContent;
    $title=$marker->getElementsByTagName('title')->item(0)->textContent;
    $address=$marker->getElementsByTagName('address')->item(0)->textContent;
    $latitude=$marker->getElementsByTagName('latitude')->item(0)->textContent;
    $longitude=$marker->getElementsByTagName('longitude')->item(0)->textContent;

    // Your filters here

    // To remove the marker you just add it to a list of nodes to delete
    $nodesToDelete[]=$marker;
}

// You delete the nodes
foreach ($nodesToDelete as $node) $node->parentNode->removeChild($node);

echo $dom->saveXML();
?>

Pode gravar o seu XML de saída desta forma

$dom->saveXML(); // This will return the XML as a string
$dom->save('file.xml'); // This saves the XML to a file

Para fazer esta análise em JavaScript deve usar jQuery (uma biblioteca pequena, mas poderosa).

Você pode incluir a biblioteca diretamente do repositório de código Google.

<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script>

a Biblioteca é cross-browser e muito pequena. Ele deve ser cache em muitos casos, porque alguns sites o usam a partir do código Google

$(yourXMLStringOrDocument).find("marker").each(function () {
     var marker=$(this);

     var type=marker.find('type').text();
     var title=marker.find('title').text();
     var address=marker.find('address').text();
     var latitude=marker.find('latitude').text();
     var longitude=marker.find('longitude').text();
});
 23
Author: Cristian Toma, 2009-07-29 10:51:04

Document Object Model (DOM) é a resposta.

<?
 $dom=new DomDocument();
 $dom->Load("file.xml");
 $root=$dom->documentElement;
 ...
 $dom->Save("file.xml");
?>
 5
Author: adatapost, 2009-07-28 11:46:43