Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

remove carraige returns from xml doc

Posted on 2004-04-28
6
Medium Priority
?
643 Views
Last Modified: 2013-12-13
I created and xml file (see below)and it displays in notepad as follows, there is carriage returns after every row.
How can remove these cr when I create my xml file.

I generate my xml file as follows. Most the code is modified code from suggestions from this site.  I use this code to generate
an xml using an online application at datareformatics.com, I can upload a csv file and then convert it to xml.  I have written code to do the reverse to import an xml file and convert to csv. However with carriage return in xml file the import fails. I'm not sure whether I should be stripping the cr on export or on import.
Thanks in advance.

$doc    = domxml_new_doc("1.0");
$data   = $doc->create_element("data");
   
for ($row_ct =1;$row_ct <= $clean_row_num ;$row_ct++)
{//ROW COUNTER LOOP
               
$row                 = $doc->create_element("row");
$row_elements  = array();

$file_row = fgetcsv( $file_handle,filesize($upload_dir.$file_nm), $import_delim);
 
 for ($col_num =0;$col_num < $initial_col_hdr_ct ;$col_num++)
 {//COLUMN COUNTER LOOP
         
  for ($i =0;$i < $final_col_hdr_ct ;$i++)
  {//LOOP FINAL COL
               
        $element_nm           = str_replace(" ", "_", $export_col_nm[$i]);//Places underscore between COL NAME                        
        $row_elements[$element_nm]  = $doc->create_element($element_nm);
                                 
        while ($dpc_row = mysql_fetch_array($select_dpc_result[$i]))
        {//WHILE LOOP
           //LOTS OF LOGIC IN HERE  to calculate $last_value[$i]                  
                         
        }//WHILE LOOP
                 
/**************************************************************************************
Add Support here for foreign chars such as accents, umlauts etc. php does not support these chars
in default charset so need to encode as UTF-8 and then when writing the file decode back to
IS-8559-1 charset i.e default charset. dump_mem(true, 'ISO-8859-1')
**************************************************************************************/

        $last_value[$i] = mb_convert_encoding($last_value[$i],'UTF-8','ISO-8859-1');                      
        $last_value[$i] = $doc->create_text_node($last_value[$i]);
        $row_elements[$element_nm]->append_child($last_value[$i]);        
        $row->append_child($row_elements[$element_nm]);


  }//END LOOP FINAL COL
       
$data->append_child($row);
         
 }//END COLUMN COUNTER LOOP
                               
}//ROW COUNTER LOOP

    $doc->append_child($data);
 
    $output_string = $doc->dump_mem(true, 'ISO-8859-1');
//Write File etc

  <?xml version="1.0" encoding="ISO-8859-1"?>
<data>
  <row>
    <ShipperID>1</ShipperID>
    <CompanyName>Speedy Express</CompanyName>
    <Phone>(503) 555-9831</Phone>
  </row>
  <row>
    <ShipperID>2</ShipperID>
    <CompanyName>United Package</CompanyName>
    <Phone>(503) 555-3199</Phone>
  </row>
  <row>
    <ShipperID>3</ShipperID>
    <CompanyName>Federal Shipping</CompanyName>
    <Phone>(503) 555-9931</Phone>
  </row>
  <row>
    <ShipperID>4</ShipperID>
    <CompanyName>Big Ships</CompanyName>
    <Phone>(503) 555-9932</Phone>
  </row>
  <row>
    <ShipperID>5</ShipperID>
    <CompanyName>B+I Shipping</CompanyName>
    <Phone>(503) 555-9933</Phone>
  </row>
  <row>
    <ShipperID>6</ShipperID>
    <CompanyName>International Shipping</CompanyName>
    <Phone>(503) 555-9934</Phone>
  </row>
  <row>
    <ShipperID>7</ShipperID>
    <CompanyName>AAA Shipping</CompanyName>
    <Phone>(503) 555-9935</Phone>
  </row>
  <row>
    <ShipperID>8</ShipperID>
    <CompanyName>NIPON Shipping</CompanyName>
    <Phone>(503) 555-9936</Phone>
  </row>
</data>
0
Comment
Question by:dplinnane
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 2
6 Comments
 
LVL 40

Accepted Solution

by:
Richard Quadling earned 2000 total points
ID: 10948217
2 answers.

1 tested ...

$sSearchFor = '|(\r\n *)|i';
$sReplaceWith = '';

$new_output_string= preg_replace($sSearchFor,$sReplaceWith,$output_string);


1 not tested ...

$output_string = $doc->dump_mem(false, 'ISO-8859-1');

Regards,

Richard.
0
 

Author Comment

by:dplinnane
ID: 10951013
I tried the second one and it works perfectly. I will award the points to you after a bitmore testing.
I have another qustion, is there anyway I could verify that a file I am upload is in the format above without the carriage returns. The file can have any number of columns, it should always be a data file.  I have an application which allow users to upload their files and clean/format and convert them to an export file type, either csv, fixed width, and insert statement.
I want to insure that the xml file they are uploading will not crash my app because it is in a correct fromat. I'll postthis as a new question once I hear back from you.
0
 
LVL 40

Expert Comment

by:Richard Quadling
ID: 10957131
What you are looking for is a way to compare an XML file against a XSD / DTD (I think that's the right acronyms).

From what I know, an XSD is an XML file which describes an XML file.

e.g.

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="version_control" type="version_controlType"/>
  <xs:complexType name="version_controlType">
    <xs:sequence>
      <xs:element name="applications" type="applicationsType"/>
      <xs:element name="notifications" type="notificationsType"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="applicationsType">
    <xs:sequence>
      <xs:element name="application" type="applicationType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="applicationType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="current_version" type="xs:decimal"/>
      <xs:element name="url" type="xs:string"/>
      <xs:element name="regx" type="xs:string"/>
      <xs:element name="download_url" type="xs:string"/>
      <xs:element name="save_location" type="xs:string"/>
      <xs:element name="notify" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="notificationsType">
    <xs:sequence>
      <xs:element name="notification" type="notificationType" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="notificationType">
    <xs:sequence>
      <xs:element name="notify" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>


This file describes a file I use to hold data about application version numbers and who should be contacted when the version numbers change.

The above file was produced using a small Delphi app.

I do not know (at this stage) how to validate an XML vs XSD/DTD. The XML parser within PHP does not validate XML files.

I suspect you will need to use an external tool to validate them.

I did find ...

http://codingtheweb.users.phpclasses.org/browse.html/package/608.html

which is ...

"This class implements the Schematron 1.5 language to validate XML documents, it uses the XSLT PHP extension and can validate XML files using Schematron XML files or compiled Schematron scripts as XSLT. Many different ways to validate files/uris/etc are provided."

Maybe this will do what you want.

Richard.
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 40

Expert Comment

by:Richard Quadling
ID: 11004669
Any joy?
0
 

Author Comment

by:dplinnane
ID: 11015705
I'll look into the above but you will see if you check out the site that I can not use an external tool it has to be built in as part of of our app. For now I have put simple checks in place as follows. $row_elements[0]->name   =='#text' this checks if carriage returns exist after each row element, this will cause a failure so I exit and send a message to the browser that the file is invalid. As I mentioned in another post you can check it out at.  I'm sure there is other logic I could add which looks for row and data tags. For now I will have to use this technique as the above mentioned is beyond my abilities right now.
https://datareformatics.com/index_login.php?guest_email=guest@datareformatics.com&guest_pw=guest123&is_guest=yes


 $doc = xmldocfile("$upload_dir$file_nm");
   
    if (!$doc = xmldocfile("$upload_dir$file_nm"))
    {
   
    return  "Error in XML document $upload_dir$file_nm";
   
    }
    elseif ($doc->version > 1.0)
    {
   
    return  'Unsupported XML version';

    }
           
    $doc = domxml_open_file("$upload_dir$file_nm");

    $rows = $doc->get_elements_by_tagname("row");
   
    util_dr_print_r ($rows,'rows get_elements_by_tagname', $function_nm, __LINE__);

/**************************************************************************************
comment:
Sample 5 rows and if no errors return true which mean the file is ok.
**************************************************************************************/        
    foreach($rows as $row)
    {
    $row_ct++;
   
    $row_elements = $row->child_nodes();

    util_dr_print_r ($row_elements,'row_elements xml', $function_nm, __LINE__);

        if($row_elements[0]->name   =='#text')
        {
       
        return  'XML file format is invalid';
           
        }
        else
        {

            if($row_ct   > '5')
            {
           
            return  'true';
               
            }
       
        }
       
    }
   
0
 
LVL 40

Expert Comment

by:Richard Quadling
ID: 11015990
I think validating an XML file against a schema is going to be quite tricky in just PHP.

If you need this sort of thing, talk to the hoster. Most can add in functionality if required.
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Styling your websites can become very complex. Here I'll show how SASS can help you better organize, maintain and reuse your CSS code.
There are times when I have encountered the need to decompress a response from a PHP request. This is how it's done, but you must have control of the request and you can set the Accept-Encoding header.
The viewer will receive an overview of the basics of CSS showing inline styles. In the head tags set up your style tags: (CODE) Reference the nav tag and set your properties.: (CODE) Set the reference for the UL element and styles for it to ensu…
The viewer will the learn the benefit of plain text editors and code an HTML5 based template for use in further tutorials.
Suggested Courses

604 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question