2016-07-14 15 views
2

我無法用肥皂信封及正文標記生成XML生成與SOAP信封和body標籤XML,這裏是代碼,如何使用PHP

$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)); 
       } 
      } 

產生密鑰和值的XML中的上述代碼像

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

,但我想生成XML像

<?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> 

請幫助我。

+0

您的源數據在哪裏?它包含什麼? – Parfait

+0

來自數據庫的Sorce數據($ result_array = $ result-> fetch_assoc()) –

回答

1

SOAP頭本質上是XML名稱空間,可以使用DOMDocument的createElementNS添加。所以,簡單地將XML內容前添加它們:

$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)); 
    } 
} 

另外,考慮XSLT,特殊用途的語言來轉換XML文件。此方法按原樣使用當前設置,並使用XSLT封裝SOAP標頭進行轉換:

// 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="AddDetails"/>  
       </xsl:template> 

       <xsl:template match="AddDetails"> 
       <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/"> 
         <xsl:apply-templates select="@*|node()"/> 
        </AddDetails> 
        </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; 
+0

非常感謝您,先生,但只有一個字段丟失。即, addDeatilsmissing xmlns –

+0

只需將AddDetails'createElement()'替換爲'createElementNS()':'$ XMLDoc-> createElementNS('http:// tempuri .org /','AddDetails');'。並將名稱空間添加到XSLT。 – Parfait

+0

由此產生的空文檔 –