Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 651
  • Last Modified:

remove carraige returns from xml doc

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
dplinnane
Asked:
dplinnane
  • 4
  • 2
1 Solution
 
Richard QuadlingSenior Software DeveloperCommented:
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
 
dplinnaneAuthor Commented:
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
 
Richard QuadlingSenior Software DeveloperCommented:
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
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
Richard QuadlingSenior Software DeveloperCommented:
Any joy?
0
 
dplinnaneAuthor Commented:
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
 
Richard QuadlingSenior Software DeveloperCommented:
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now