Sri P Sri P - 4 months ago 44
PHP Question

how to generate XML with soap envelope and body tag using php

I'm unable to generate XMl with Soap Envelop and Body Tag, here is the code,

$rootElement = $XMLDoc->createElement('AddDetails');
$rootNode = $XMLDoc->appendChild($rootElement);

while($result_array = $result->fetch_assoc()) {
$StockCount++;
foreach($result_array as $key => $value) {
$value=trim($value);
if($value=="NULL" || $value=="" ||$value==-1){
$value="";
}
$value=htmlentities($value);//For validating & chars
$rootNode->appendChild($XMLDoc->createElement($key,$value));
}
}


The above code resulting XMl with Key and values like

<AddDetails>
<First_Name>TestFName</First_Name>
<Last_Name>TestLName</Last_Name>
</AddDetails>


but i want to generate XML like

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<AddDetails xmlns="http://tempuri.org/">
<First_Name>TestFName</First_Name>
<Last_Name>TestLName</Last_Name>
</AddDetails>
</soap:Body>
</soap:Envelope>


Please help me.

Answer

SOAP headers are essentially XML namespaces which can be added using DOMDocument's createElementNS. So simply add them before the XML content:

$XMLDoc = new DOMDocument('1.0', 'UTF-8');
$XMLDoc->preserveWhiteSpace = false;
$XMLDoc->formatOutput = true;

// SOAP ENVELOPE ELEMENT AND ATTRIBUTES
$soap = $XMLDoc->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'soap:Envelope');
$XMLDoc->appendChild($soap);

$soap->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$soap->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:xsd', 'http://www.w3.org/2001/XMLSchema');
$soap->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:soap', 'http://schemas.xmlsoap.org/soap/envelope/');

// SOAP BODY
$body = $XMLDoc->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'soap:Body');

// XML CONTENT
$rootElement = $XMLDoc->createElementNS('http://tempuri.org/', 'AddDetails');
$rootNode = $body->appendChild($rootElement);

while($result_array =  $result->fetch_assoc())  {
    $StockCount++;
      foreach($result_array as $key => $value)  {
          $value=trim($value);
          if($value=="NULL" || $value=="" ||$value==-1){
                $value="";
          }
        $value=htmlentities($value);//For validating & chars
        $rootNode->appendChild($XMLDoc->createElement($key,$value));
    }
}

Alternatively, consider XSLT, the special purpose language to transform XML files. This approach uses your current setup as is and transforms it with XSLT wrapping SOAP headers:

// XML CONTENT
$rootElement  = $XMLDoc->createElement('AddDetails');
$rootNode = $XMLDoc->appendChild($rootElement);

while($result_array =  $result->fetch_assoc())  {
    $StockCount++;
      foreach($result_array as $key => $value)  {
          $value=trim($value);
          if($value=="NULL" || $value=="" ||$value==-1){
                $value="";
          }
        $value=htmlentities($value);//For validating & chars
        $rootNode->appendChild($XMLDoc->createElement($key,$value));
    }
}

// XSL SCRIPT
$XSLDoc = new DOMDocument('1.0', 'UTF-8');

$xslstr = '<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
            <xsl:output version="1.0" encoding="UTF-8" indent="yes" />
            <xsl:strip-space elements="*" />

              <xsl:template match="/">    
                  <xsl:apply-templates select="Bares"/>    
              </xsl:template>

              <xsl:template match="Bares">
                <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                               xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
                  <soap:Body>
                    <Bares xmlns="http://tempuri.org/">
                        <xsl:apply-templates select="@*|node()"/>
                    </Bares>
                  </soap:Body>
                </soap:Envelope>
              </xsl:template>

              <xsl:template match="*">
                  <xsl:element name="{local-name()}" namespace="http://tempuri.org/">
                        <xsl:apply-templates select="@*|node()"/>
                  </xsl:element>
              </xsl:template>   

            </xsl:transform>';

$XSLDoc->loadXML($xslstr);

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($XSLDoc);

// Transform XML source
$newXML = $proc->transformToXML($XMLDoc);

echo $newXML;