2009-07-10 32 views
0

下面是一個簡單的表格,我使用在admin_xml.php如何提高將下面的代碼PHP

<form name="review" action="admin_xml.php" method="post"> 
<textarea name="xml" cols="40" rows="10"></textarea> 
<input class="submit" type="submit" value="Submit Request"> 
</form> 

這裏發送XML數據是我爲了取回數據進入XML從MySQL數據庫

<?xml version="1.0" encoding="UTF-8"?> 
<GetOrdersIds> 
    <Credentials> 
     <Username>my_username</Username> 
     <Password>my_password</Password> 
    </Credentials> 
    <Criterions> 
     <OrderNumber></OrderNumber> 
     <StartDate>2009-01-01</StartDate> 
     <EndDate>2009-07-01</EndDate> 
    </Criterions> 
</GetOrdersIds> 

這裏是一個從XML中提取標籤的PHP代碼:

<?php  

$text_all = "<?xml version=\"1.0\"?>\r\n<GetOrdersIds version=\"1.0\">\r\n<Credentials>\r\n<Username>my_username</Username>\r\n<Password>my_password</Password>\r\n</Credentials>\r\n<Criterions>\r\n<OrderNumber></OrderNumber>\r\n<StartDate>2009-01-01</StartDate>\r\n<EndDate>2009-07-01</EndDate>\r\n</Criterions>\r\n</GetOrdersIds>"; 

$field = "Criterions"; 

$result = substr($text_all, strpos($text_all, "<".$field.">")+strlen("<".$field.">"), strpos($text_all, "</".$field.">")-strlen("<".$field.">")-strpos($text_all, "<".$field.">")); 


?> 

從上面的PHP代碼的結果是:

<OrderNumber></OrderNumber> 
<StartDate>2009-01-01</StartDate> 
<EndDate>2009-07-01</EndDate> 

當腳本運行時,PHP代碼經過我的MySQL數據,並提取開始日期和給出的結束日期之間的所有訂單以上。


是否有改進下面的PHP代碼的一種更好的方式,使之執行相同的功能:

$result = substr($text_all, strpos($text_all, "<".$field.">")+strlen("<".$field.">"), strpos($text_all, "</".$field.">")-strlen("<".$field.">")-strpos($text_all, "<".$field.">")); 

這是搜索整個XML數據和檢索所有標籤的代碼。

UPDATE:

誰能列出的SimpleXML的$結果代碼?

+0

使用PHP的SimpleXML類(http://ca2.php.net/simplexml) – tomzx 2009-07-10 21:19:00

回答

3

一些臨時瓦爾將幫助,也使其更易於閱讀。

$result = substr($text_all, strpos($text_all, "<".$field.">")+strlen("<".$field.">"), strpos($text_all, "</".$field.">")-strlen("<".$field.">")-strpos($text_all, "<".$field.">")); 

可以重寫。

$tagLen = strlen('<'.$field.'>'); 
$openTag = strpos($text_all, '<'.$field.'>'); 
$closeTag = strpos($text_all, '</'.$field.'>', $openTag); 

$result = substr($text_all, $openTag + $tagLen, $closeTag - $tagLen - $openTag); 

或使用SimpleXML

$doc = simplexml_load_string($text_all); 
echo $doc->Criterions->asXML(); 

如果要在各個值使用。

$doc = simplexml_load_string($text_all); 

echo $doc->Criterions->OrderNumber; 
echo $doc->Criterions->StartDate; 
echo $doc->Criterions->EndDate; 

如果你想在XML元素,然後使用asXML():

$doc = simplexml_load_string($text_all); 

echo $doc->Criterions->OrderNumber->asXML(); 
echo $doc->Criterions->StartDate->asXML(); 
echo $doc->Criterions->EndDate->asXML(); 
+0

你的代碼是不完整的。它沒有給我完整的標籤。 – 2009-07-10 21:49:00

+0

固定。對於那個很抱歉。只是去顯示這樣一個非常長的表達的危險。起初,我甚至沒有注意到結束標籤。 – gradbot 2009-07-10 22:45:20

1

使用XML解析器像SimpleXML來提取數據:

$doc = simplexml_load_string($_POST['xml']); 
$OrderNumber = $doc->Criterions->OrderNumber; 
$StartDate = $doc->Criterions->StartDate; 
$EndDate = $doc->Criterions->EndDate; 
+0

您可以列出的$代碼變化導致的SimpleXML。 – 2009-07-10 21:20:22

+0

@Gumbo,我試圖上面的代碼。它的工作,但它只是給我的元素的值。(2009-01-01) 我需要它的價值沿着完整的元素。即( 2009-01-01) – 2009-07-10 21:43:58

2

隨着SimpleXML

<?php 
$xmlSTR = '<?xml version="1.0" encoding="UTF-8"?> 
<GetOrdersIds> 
    <Credentials> 
     <Username>my_username</Username> 
     <Password>my_password</Password> 
    </Credentials> 
    <Criterions> 
     <OrderNumber></OrderNumber> 
     <StartDate>2009-01-01</StartDate> 
     <EndDate>2009-07-01</EndDate> 
    </Criterions> 
</GetOrdersIds>'; 

$xml = new SimpleXMLElement($xmlSTR); 

echo $xml->Credentials->Username; 

//To see the entire structure print_r($xml); as php can access objects as arrays 
1

假設你的XML字符串存儲在名爲$text_all變量(如你在你的例子中展示),這會讓你得到你想要的男人......:-)

$mysql_stuff = ''; 
$xml = new SimpleXMLElement($text_all); 

foreach($xml->Criterions->children() as $criterion) { 
    $mysql_stuff .= $criterion->asXML()."\n"; 
} 
echo $mysql_stuff; 

$mysql_stuff現在將包含:

<OrderNumber/> 
<StartDate>2009-01-01</StartDate> 
<EndDate>2009-07-01</EndDate> 

我測試了這一點,它的工作原理。我希望這回答了你的問題!