Как улучшить следующий код в PHP - PullRequest
0 голосов
/ 11 июля 2009

Вот простая форма, которую я использую для отправки данных XML в admin_xml.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.">"));


?>

Результат от вышеуказанного 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 и извлекает все теги.

ОБНОВЛЕНИЕ:

Может ли кто-нибудь перечислить код результата $ в SimpleXML?

Ответы [ 5 ]

3 голосов
/ 11 июля 2009

Некоторые временные переменные помогут, а также облегчат чтение.

$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();
2 голосов
/ 11 июля 2009

С 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 голос
/ 11 июля 2009

Если ваша строка 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>

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

1 голос
/ 11 июля 2009

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

$doc = simplexml_load_string($_POST['xml']);
$OrderNumber = $doc->Criterions->OrderNumber;
$StartDate = $doc->Criterions->StartDate;
$EndDate = $doc->Criterions->EndDate;
1 голос
/ 11 июля 2009

Посмотрите на модуль simplexml .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...