The curse of XML and PHP scrolling

I have a problem with DOMDocument and spaces. I currently have two types of XML files. One file was created by hand about a year ago, I will call this file A. The second file, file B, is generated using PHP DOMDocument. I am trying very hard (unsuccessfully) to make the space in file A to match file B.

Here's how it works ... The user is given the option to add new elements <Slide>

to the XML file. After adding new slides, the user can add a new one <Items>

to the XML file as a child element <Slide>

.

When I add an item <Slide>

to file B, it works like a charm. I can even add a new item <Item>

with zero problem. However, when I try to access a new item <Identifier>

, I just added to file B using the second PHP script below with $order != 'remove'

. I skipped node by one and <Information/>

select instead <Information/>

.

It seems that the manually generated file A has a space that is missing from my generated file B. I experimented with the preserveWhitespace property, but it didn't help.

Are there any suggestions as to how I can fix this issue. Constructive criticism is also welcome as this is my first shot at dynamic XML manipulation. I apologize for the length and appreciate your time!

File A - Created by hand - I am trying to match this file!

<?xml version="1.0" encoding="UTF-8"?>
<root>
<Areas>Head &amp; Neck</Areas>
<Area>Head &amp; Neck</Area>
<Type>Angiograph</Type>
<Slide>Ag-01a
    <Title>Catheter Angiography</Title>
    <Item1>
        <Identifier interestCoord=".51,.73" locator="point" labelBool="true" labelTxt="" leaderBool="true">Aortic Arch
        </Identifier>
        <Information/>
        <Question A="" B="" C="" D="" E="" Answer=""/>
    </Item1>

             .... More Items 

      

File B - before being added by the user <Slide>

. This part is created by hand. Template if you like. After the user has entered the slides, new slides are created using the code snippet below.

<?xml version="1.0" encoding="UTF-8"?>
<root>
<Areas>Head &amp; Neck</Areas>
<Area>Head &amp; Neck</Area>
<Type>Brain Sections</Type>
</root>

      

File B - after users add new <Slide>

and <Item>

. The formatting shown is the formatting generated by the DOMDocument. I think there is a mistake happening here! Spaces !!!

<Slide>Ag-09a
    <Title>Catheter Angiography</Title>
<Item1><Identifier locator="point" interestCoord="0.143,0.65" labelBool="true" labelTxt="" leaderBool="false">Orbit</Identifier><Information/><Question A="" B="" C="" D="" E="" Answer=""/></Item1></Slide>

      

PHP script is used to add new <Slide>

elements to XML

<?php
session_start();

//Constants
$SECTION_SEP = "========================================================================</br>";

//Variables used to construct file path
$area = trim($_POST['area']);
$slideType = trim($_POST['slideType']);

$rawSlides = trim($_POST['theseSlides']);
$newSlideList = explode(",", $rawSlides);

$fileLocation = "../XML/".$area."/".$slideType."/".$area.".XML";

$dom = new DOMDocument();
echo('New DOMDocument created!</br>');

$dom->load($fileLocation);
echo('XML file loaded!</br>');

/*$dom->preserveWhiteSpace = false;
echo('White space removed!</br>');*/

$dom->documentElement;
echo('DOM initialized!</br>');

if ($dom->getElementsByTagName('Slide')->length == 0){  //New file with no slides

foreach ($newSlideList as $slide){
    $newSlide = $dom->createElement('Slide', $slide);
    $newTitle = $dom->createElement('Title', 'Scan');

    //Add the title element to the Item
    $newSlide->appendChild($newTitle);

    $dom->childNodes->item(0)->appendChild($newSlide);
    echo($slide." has been added to the list!</br>");
 }

} else {
$locators = $dom->getElementsByTagName('Slide');

}

if($dom->save($fileLocation)){
echo("File saved successfully!!");

}else echo("There was a problem saving the file!");

      

PHP script is used to add / edit / delete <Item>

and <Identifier>

nodes depending on the value $orders

== WARNING! Long:/

<?php
session_start();

//Constants
$SECTION_SEP = "========================================================================</br>";

//Variables used to construct file path
$area = trim($_POST['area']);
$slideType = trim($_POST['slideType']);

$fileLocation = "../XML/".$area."/".$slideType."/".$area.".XML";

//echo("File location:".$fileLocation);

//Current data (c_ for current)
$c_poi = "";
$c_type = "";
$c_lblBool = "";
$c_lblOverride = "";
$c_leaderBool = "";

//Determine if this visit is for new or old data
$orders = trim($_POST['orders']);

//Variables used to replace information in XML file loaded below (n_ for new)
$n_slideName = trim($_POST['slideName']); //slide name in view format ie Ag-01a
$n_identName = trim($_POST['ident']); //contains multiple information separated by comma ie 0,Aortic Arch
$n_type = trim($_POST['type']); //locator type
$n_poi = trim($_POST['poi']);
$n_lblBool = trim($_POST['lblBool']);
$n_lblOverride = trim($_POST['lblOverride']);

echo("Modified: ".date('c')."</br>");
$dom = new DOMDocument();
echo('New DOMDocument created!</br>');

$dom->load($fileLocation);
echo('XML file loaded!</br>');

/*$dom->preserveWhiteSpace = false;
echo('White space removed!</br>');*/

$dom->documentElement;
echo('DOM initialized!</br>');

$locators = $dom->getElementsByTagName('Slide');
echo($locators->length.' elements retrieved</br>');

$slideEntryFound = false;
$identEntryFound = false;
$identAttributesFound = false;
echo($SECTION_SEP);

//Locate the correct slide node
foreach ($locators as $locator){

//If there is a match, store the infomation
// rawSlide[x].childNode[0].nodeValue
if(strcmp(trim($locator->childNodes->item(0)->nodeValue),$n_slideName) == 0){

    $slideEntryFound = true;
    $slideChildren = $locator->childNodes;

    //Locate the correct identifier node
    foreach($slideChildren as $child){

        if( strcmp(trim($child->nodeValue), substr($n_identName,strpos($n_identName,",")+1)) == 0){
            $identEntryFound = true;
            if (strcmp($orders, "remove") == 0){//Removing an element


                echo("The identifier being removed is: ".trim($child->nodeValue."</br>"));
                echo("The node path is: ".($child->childNodes->item(1)->getNodePath())."</br>");
                echo($SECTION_SEP);

                $locator->removeChild($child);
                echo("Identifier successfully removed!</br>");
                echo($SECTION_SEP);
                break;

            } else {//Not removing anything - Adding or Editing

                echo("The identifier being modified is: ".trim($child->nodeValue."</br>"));
                echo("The node path is: ".($child->childNodes->item(1)->getNodePath())."</br>");
                echo($SECTION_SEP);

                if($child->childNodes->item(1)->hasAttributes()){

                    $identAttributesFound = true;

                    $c_poi = $child->childNodes->item(1)->getAttribute('interestCoord');
                     echo("--Current interestCoord: ".$c_poi."</br>");
                     echo("++New interestCoord: ".$n_poi."</br>");
                    if(strcmp($c_poi, $n_poi) != 0){
                       $child->childNodes->item(1)->setAttribute('interestCoord',$n_poi);
                    }

                    $c_type = $child->childNodes->item(1)->getAttribute('locator');
                     echo("--Current locator: ".$c_type."</br>");
                     echo("++New locator: ".$n_type."</br>");

                    $c_lblBool = $child->childNodes->item(1)->getAttribute('labelBool');
                     echo("--Current labelBool: ".$c_lblBool."</br>");
                     //echo("++New labelBool: ".$n_lblBool."</br>");

                    $c_lblOverride = $child->childNodes->item(1)->getAttribute('labelTxt');
                     echo("--Current labelOverride: ".$c_lblOverride."</br>");
                     echo("++New labelOverride: ".$n_lblOverride."</br>");

                    $c_leaderBool = $child->childNodes->item(1)->getAttribute('leaderBool');
                     echo("--Current leaderBool: ".$c_leaderBool."</br>");
                     //echo("++New leaderBool: ".$n_leaderBool."</br>");

                    if($n_lblOverride != ""){
                        echo("**A new label override was detected. The identifier will have the alias ".$n_lblOverride.".");
                    }
               break;
            } else echo("Fatal Error - Node does not contain attributes!</br>");

            if($identEntryFound == true && $identAttributesFound == false)
                echo("Error - Attribute entry not found!");
            break;
            }
        }

    }

    if($slideEntryFound == true && $identEntryFound == false && $orders != "remove"){

        echo("The identifier was not found... creating a new identifier!</br>");

     //Create a new Element

        $newElement = $dom->createElement("Item".((integer)(substr($n_identName,0,strpos($n_identName,",")))+1));

        echo("New element created!!</br>");

        //Create new Item children
        $newSubElem = $dom->createElement("Identifier", substr($n_identName,strpos($n_identName,",")+1));
        $newSubElem->setAttribute('locator',$n_type);
        $newSubElem ->setAttribute('interestCoord',$n_poi);
        $newSubElem->setAttribute('labelBool', $n_lblBool);
        $newSubElem->setAttribute('labelTxt', $n_lblOverride);
        //TODO link this next one to a variable instead of hard coding
        $newSubElem->setAttribute('leaderBool', "false");

        //Info Child
        $newInfoElem = $dom->createElement("Information");
        //Question Child
        $newQuestion = $dom->createElement("Question");
            $newQuestion->setAttribute('A', "");
            $newQuestion->setAttribute('B', "");
            $newQuestion->setAttribute('C', "");
            $newQuestion->setAttribute('D', "");
            $newQuestion->setAttribute('E', "");
            $newQuestion->setAttribute('Answer', "");

        //Add new children to main Item
        $newElement->appendChild($newSubElem);
        $newElement->appendChild($newInfoElem);
        $newElement->appendChild($newQuestion);

        $locator->appendChild($newElement);


        echo("New identifier added!!</br>");

    break;
    }
} else {

}
}
if($slideEntryFound == false)
echo("Error - Slide entry not found!");

if($dom->save($fileLocation)){
echo("File saved successfully!!");

echo('<div id="phpHandleBtns>"></br><form><button type="submit" id="continueEdit" formaction="../edit.php">Continue Editing</button>'.
    '</br><button type="submit" id="doneEdit" formaction="../main.php">Done Editing</button></form></div>');

}else echo("There was a problem saving the file!");

?>

      

+3


source to share


1 answer


I highly recommend you use XPath APIs like http://php.net/manual/en/class.domxpath.php to find the nodes you are interested in. Trying to use the DOM API directly will only give you heartache.



Specifically, I think your call to the childNode () function is triggered by a space, but if you used childElement () instead (not sure if it exists, but it's easy with XPath) it just ignores any spaces.

+1


source







All Articles