How to modify xml file using PHP

Document Object Model (DOM) is the answer.

<?
 $dom=new DomDocument();
 $dom->Load("file.xml");
 $root=$dom->documentElement;
 ...
 $dom->Save("file.xml");
?>

You can use the DOMDocument from PHP.

You load your file and than loop trough the childNodes of the document.

<?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();
?>

You can save your output XML like this

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

To do this parsing in JavaScript you should use jQuery (a small, but powerful library).

You can include the library directly from Google Code Repository.

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

The library is cross-browser and very small. It should be cached in many cases, because some sites use it from Google Code

$(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();
});

<?php
$xml = new DOMDocument('1.0','UTF-8');
$xml->preserveWhiteSpace = FALSE;
            
$xml->load("markers.xml");
        
$mar = $xml->getElementsByTagName("marker");
foreach($mar as $row){


            $type = $row->getElementsByTagName('type')->item(0);
            $title = $row->getElementsByTagName('title')->item(0);
            $address = $row->getElementsByTagName('address')->item(0);
            $latitude = $row->getElementsByTagName('latitude')->item(0);
            $longitude = $row->getElementsByTagName('longitude')->item(0);
            
            $row->replaceChild($type, $type);
            $row->replaceChild($title, $title);
            $row->replaceChild($address, $address);
            $row->replaceChild($latitude, $latitude);
            $row->replaceChild($longitude, $longitude);
          
            ?>
            
<form id="q_form" method="post" action="">
    <div class="form-group form-group-lg">
        <div class="table-responsive">
            <table id="choices_table"  class="table table-bordered"  >
                <tr>
                    <td>
                        <div class="form-group">
                            <input type="type"
                                    name ="title" 
                                    value="<?php echo $type->nodeValue ?>"
                                    />
                        </div>
                    </td>
                    <td>
                    <div class="form-group">
                        <input type="text"
                                name ="title" 
                                value="<?php echo $title->nodeValue ?>"
                                />
                     </div>
                    </td>
                    <td>
                    <div class="form-group">
                        <input type="text"
                                name ="address" 
                                value="<?php echo $address->nodeValue ?>"
                                />
                     </div>
                    </td>
                    <td>
                    <div class="form-group">
                        <input type="latitude"
                                name ="latitude" 
                                value="<?php echo $latitude->nodeValue ?>"
                                />
                     </div>
                    </td>
                    <td>
                    <div class="form-group">
                        <input type="latitude"
                                name ="longitude" 
                                value="<?php echo $longitude->nodeValue ?>"
                                />
                     </div>
                    </td>
        </table>
        </div>  
    
</div>
    <input type="submit"  name="submit" value=" EDIT "  class="btn btn-primary" />
</form>  
    <?php



    if (isset($_POST['submit']))
    {
    $type->nodeValue = $_POST['type'];    
    $text->nodeValue = $_POST['text'];
    $address->nodeValue = $_POST['address'];
    $latitude->nodeValue = $_POST['latitude'];
    $longitude->nodeValue = $_POST['longitude'];
    $xml->save("markers.xml");
        }
    
}

?>

Tags:

Php

Xml