2009-07-10 3 views
0

Вот простая форма, я использую для передачи данных XML в 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, который я ввожу для извлечения данных из базы данных 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> 

Вот код PHP, который извлекает теги из XML:

<?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.">")); 


?> 

В результате из приведенного выше кода РНР:

<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

ответ

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

Код не заполнен. Это не дает мне полных тегов. –

+0

Исправлено. Извини за это. Просто идет, чтобы показать опасность такого долгого выражения. Я даже не заметил закрывающий тег. – gradbot

+0

На стороне примечания, если вы используете asXML на пустой элемент или элемент, содержащий пустой ребенок, вы получите вместо gradbot

1

Использование XML-парсер, как SimpleXML извлечь эти данные:

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

Можете ли вы перечислить изменение кода в $ result в SimpleXML. –

+0

@ Gumbo, я попробовал приведенный выше код. Его работа, но это только дает мне значение элементов. (2009-01-01) Мне нужен полный элемент вместе с его значением. i.e ( 2009-01-01) –

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 
+0

Это даст мне только значение элемента. Мне нужен как элемент, так и его значение. Подобно этому ::: 2009-01-01

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> 

Я испытал это, и она работает. Надеюсь, это ответит на ваш вопрос!

+0

Спасибо, плохо попробуйте. –

Смежные вопросы