www.webdeveloper.com
Results 1 to 10 of 10

Thread: [RESOLVED] XML parsing problems

  1. #1
    Join Date
    Jan 2010
    Posts
    39

    resolved [RESOLVED] XML parsing problems

    I have written a rather complicated piece of code, here are lines 25-29 of save_location.php:

    PHP Code:
    $address_dom '<street>'.$_POST["street"].'</street><streetNo>'.$_POST["streetno"].'</streetNo><city>'.$_POST["city"].
    '</city><postalCode>'.$_POST["tk"].'</postalCode>';

    $address_element = new SimpleXMLElement($address_dom);
    $current_uni->addChild('address'$address_element); 
    This gives me the following error and warnings:

    Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : Extra content at the end of the document in ***/save_location.php on line 28

    Warning: SimpleXMLElement::__construct(): Λάρισα41500 in ***/save_location.php on line 28

    Warning: SimpleXMLElement::__construct(): ^ in ***/save_location.php on line 28

    Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in ***/save_location.php:28 Stack trace: #0 ***/save_location.php(28): SimpleXMLElement->__construct('
    Any ideas? It's a part of my thesis, I am really stuck and nervous cause I still have a lot to do

    Kudos on the website, has helped a lot so far

  2. #2
    Join Date
    Jan 2010
    Posts
    39
    forgot to show you this, it goes before the previous piece of code:

    PHP Code:
    $current_uni $xml->addChild('Placemark'); // Adding Placemark 

  3. #3
    Join Date
    Jul 2009
    Location
    Falls Church, Va.
    Posts
    780

    Arrow

    Hmm.... Based on the error and odd looking characters it looks like encoding issues in one or more of those $_POST variables, i.e. you need to do one of two things -- convert the strings to their proper html entities or wrap each $_POST with the CDATA sequence so the parser skips encoding of that text.

    Solution 1:

    Just pass each $_POST variable to the function, i.e.

    PHP Code:
    $address_dom '<street>'.XMLEntities($_POST["street"]).'</street>'// example 
    See next post with attached source - the forum converts & to its htmlentities using the code/html/php tags or simply pasting as plain text.

    Solution 2:

    A CDATA section starts with "<![CDATA[" and ends with "]]>"

    Example:

    PHP Code:
    $address_dom '<street><![CDATA['.$_POST["street"].']]></street>'
    Although personally I like the first solution - it doesn't pass the burden of properly decoding to the receiving end and ends up with cleaner XML. But to each their own.

    This is my best guess at this point! If this doesn't help, let me know.

    -jim
    Last edited by SrWebDeveloper; 01-09-2010 at 09:41 AM. Reason: fixed ampersand issue

  4. #4
    Join Date
    Jul 2009
    Location
    Falls Church, Va.
    Posts
    780
    See attached .doc file with source for solution 1.
    Attached Files Attached Files

  5. #5
    Join Date
    Jan 2010
    Posts
    39
    Hello Jim and thanks for the prompt reply. I'm gonna try it with htmlspecialchars() first, actually the characters are not weird, the data in the xml file is just in Greek and I don't think it would be wise changing them to values like &#8216. I am using UTF-8 encoding and everything is running smoothly for now. I'll let you know how that went.

  6. #6
    Join Date
    Jan 2010
    Posts
    39
    Actually that did not work at all. I still have a problem. The thing is, I have previously written other lines of code with the same way of parsing the XML data without a problem. I think the problem lies in the point where i want to add a second level of a child element.

    My XML file structure consists of "Placemark" elements with this structure:

    Code:
    		<Placemark id="1000" status="1" cat="2">
    			<name>Ανώτατο Τεχνολογικό Εκπαιδευτικό Ινστιτούτο Λάρισας</name>
    			// STATUS 0 = draft, 1 = OK, 2 = proteinomeno,  CAT 1 = AEI, 2 = TEI
    			<description>
    				
    			</description>
    			<Point>
    				<coordinates>39.627672, 22.381532</coordinates>
    			</Point>
    			<address>
    				<street></street>
    				<streetNo></streetNo>
    				<city>Λάρισα</city>
    				<postalCode>41500</postalCode>
    			</address>
    			<phoneNumber>+302410684200</phoneNumber>
    			<faxNumber>+302410610803</faxNumber>
    			<links><!-- oi selides twn idrymatwn -->
    				<homepage>http://www.teilar.gr/</homepage>
    				<newsFeed>http://www.teilar.gr/news.php</newsFeed><!-- Gia mini-newsfeed 5 teleftaiwn enimerwsewn -->
    				<departments>http://www.teilar.gr/schools.php</departments>
    				<underGrad>http://dionysos.teilar.gr/unistudent/depProgramList.asp?level=1&amp;mnuid=mnu2;submnu1</underGrad>
    				<postGrad>http://www.teilar.gr/tei_msc.php</postGrad>
    				<research>http://www.teilar.gr/ereyna.php</research>
    				<alumni><!-- eleos, N/A --></alumni>
    				<library>http://library.teilar.gr/</library>
    				<itServices><!-- eleos, N/A --></itServices>
    				<staff>http://www.teilar.gr/personel.php</staff>
    				<!-- Student stuff, separate funky placement in site -->
    				<eSecry>http://dionysos.teilar.gr/</eSecry>
    				<eLearning>http://e-class.teilar.gr/</eLearning>
    				<studentUnion></studentUnion>
    				<international>http://www.teilar.gr/eu/index_gr.php</international>
    				<studentBoard>http://www.teilar.net</studentBoard>
    			</links>
    		
    		</Placemark>
    As you can see the name element which i parse earlier in the code is in Greek as well and I do not get an error for that. I need to find a different way to add the children elements which have children of their own (Same problem happens with the <links> element.

    I'm stuck :/ Do you see something wrong in my original logic of the construction of the (grand)children?

  7. #7
    Join Date
    Jan 2010
    Posts
    39
    To make it a bit more clear:

    • I'm making an application that shows Greek Universities on a map
    • The data is in a XML file with "Placemark" elements, the structure of which I showed before
    • I am currently writing the code that edits/adds data from a form via a POST request


    Here's the full php file which is supposed to save the new data to the XML:

    PHP Code:
    $xml simplexml_load_file($xmlfile) or die("Αρχείο XML δε βρέθηκε"); 
    $institutions=$xml->children();
    $id $_POST["id"];

    foreach (
    $institutions as $institution)  {
        if (
    $institution['id']==$id) {
            
    $dom=dom_import_simplexml($institution);
            
    $dom->parentNode->removeChild($dom);
            
    $xml->asXML($xmlfile);
        }
    }

    $current_uni $xml->addChild('Placemark'); // Adding Placemark

    $current_uni->addAttribute('id'$_POST["id"]); // Addding id
    //$current_uni->addAttribute('status', $_POST["status"]); // Adding status
    $current_uni->addAttribute('cat'$_POST["type"]);

    $current_uni->addChild('name'$_POST["name"]);

    $coord_element = new SimpleXMLElement('<coordinates>'.$_POST["coordinates"].'</coordinates>');
    $current_uni->addChild('Point'$coord_element );

    $address_dom '<street>'.htmlspecialchars($_POST["street"]).'</street><streetNo>'.htmlspecialchars($_POST["streetno"]).'</streetNo><city>'.htmlspecialchars($_POST["city"]).
    '</city><postalCode>'.htmlspecialchars($_POST["tk"]).'</postalCode>';

    $address_element = new SimpleXMLElement($address_dom);
    $current_uni->addChild('address'$address_element);

    $current_uni->addChild('phoneNumber'$_POST["tel"]);
    $current_uni->addChild('faxNumber'$_POST["fax"]);

    /* Here will be the code writing the <links> child element, I have to figure out how to do the <address> first, then it will be obvious */

    $current_uni->addChild('links'$links_element);
    $xml->asXML($xmlfile); 

  8. #8
    Join Date
    Jul 2009
    Location
    Falls Church, Va.
    Posts
    780
    Try adding to the top:

    <?xml version="1.0" encoding="iso-8859-7"?>

    Beyond that...

    The original warnings/error shows SimpleXMLElement choking on the city and postal code nodes which it apparently thought was a single node. I can only assume you fixed that error since then since the current XML validates as well formed.

    It might turn out to be weirdness with SimpleXML or the editor you're using embedding characters the parser isn't expecting. I'd offer more help if your recent code didn't validate!

    -jim

  9. #9
    Join Date
    Jan 2010
    Posts
    39
    I already have <?xml version="1.0" encoding="UTF-8"?> in the beginning of the XML file (Greek programmers prefer UTF-8, Greek 8859-7 does not work well usually).

    I didn't change the XML file, its the original, it validates perfectly, yet it gives the error you saw. I guess now that as other functions, the ones used here do not work well with Greek characters (like the ones which convert to upper case etc), but it was working perfectly with reading so it shouldn't be that. When there is a problem with Greek characters PHP usually changes them to Ararbic, Russian or whatever, but it always inputs or outputs the data.

    I still think that it's a logic error

  10. #10
    Join Date
    Jan 2010
    Posts
    39
    Solved it

    What I didn't know was that you could add an empty child. So by adding <address> first and then adding children to <address> fixed everything. I will start a new post with my next problem which is deleting elements.

    Thanks a lot, your help was a big part of the solution, it was the characters but it was PHP's fault, not the encoding's

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
HTML5 Development Center



Recent Articles