проблемы с PHP - PullRequest
       37

проблемы с PHP

3 голосов
/ 19 мая 2010

Я делаю cURL POST и получаю ответ об ошибке, анализирую его в массив, но сейчас возникают проблемы с xpath.

// XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<errors xmlns="http://host/project">
   <error code="30" description="[] is not a valid email address."/>
   <error code="12" description="id[] does not exist."/>
   <error code="3" description="account[] does not exist."/>
   <error code="400" description="phone[] does not exist."/>
</errors>

// Функция / Класс

class parseXML
{
    protected $xml;

    public function __construct($xml) {
        if(is_file($xml)) {
            $this->xml = simplexml_load_file($xml);
        } else {
            $this->xml = simplexml_load_string($xml);
        }
    }

    public function getErrorMessage() {
        $in_arr = false;
        $el = $this->xml->xpath("//@errors");        
        $returned_errors = count($el);

        if($returned_errors > 0) {
            foreach($el as $element) {
                if(is_object($element) || is_array($element)) {
                    foreach($element as $item) {
                        $in_arr[] = $item;
                    }
                }
            }
        } else {
            return $returned_errors;
        }            
        return $in_arr;
    }
}

// Вызов функции

// $errorMessage is holding the XML value in an array index
// something like: $arr[3] = $xml;
$errMsg = new parseXML($arr[3]); 
$errMsgArr = $errMsg->getErrorMessage();

Я хотел бы, чтобы все значения атрибута кода ошибки и описания

EDIT:

ОК, это print_r ($ this-> xml, true);

SimpleXMLElement Object
(
    [error] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [code] => 30
                            [description] => [] is not a valid email address.
                        )

                )

            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [code] => 12
                            [description] => Id[12345] does not exist.
                        )

                )

            [2] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [code] => 3
                            [description] => account[] does not exist.
                        )

                )

            [3] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [code] => 400
                            [description] => phone[] does not exist.
                        )

                )

        )

)

ради жизни я не могу понять, почему я могу получить код и описание, какие-либо мысли?

РЕДАКТИРОВАТЬ # 2 Хорошо, я полагаю, что сломаю это.

Я использую cURL для отправки запроса на один из наших серверов, я анализирую заголовки ответа HTTP и xml (если возвращается xml). каждую строку в header / xml я разрываю в массив. поэтому, если есть ошибка, я вижу дополнительный индекс к массиву. Затем я делаю что-то вроде этого.

$if_err_from_header = $http_return_response[10]; 
// I know that index 10 is where if any the error message in xml is (the one posted above).

после этого я делаю это:

$errMsg = new parseXML($if_err_from_header); 
$errMsgArr = $errMsg->getErrorMessage();

до сих пор не могу получить код и описание из атрибутов по ошибке, что мне не хватает?

РЕДАКТИРОВАТЬ # 3 Хорошо, почему это работает?

$in_arr = false;
// This returns all the code attributes
$el = $this->xml->xpath("//@code");

# if $el is false, nothing returned from xpath(), set to an empty array
$el = $el == false ? array() : $el;

foreach($el as $element) {
    $in_arr[] = array("code" => $element["code"], "description" => $element["description"]);
}
return $in_arr;

РЕДАКТИРОВАТЬ # 4:

Хорошо, получаются те значения, которые я хочу, но это своего рода хак, хотелось бы выбрать конкретные элементы, но ...

$el = $this->xml->xpath("//*");

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Убедитесь, что вы учитываете пространство имен:

$this->xml->registerXPathNamespace('n', 'http://host/project');
$el = $this->xml->xpath("/n:errors/n:error");
$returned_errors = count($el);

И пример доступа к значениям для понижения.

foreach($el as $element) {
   print "code: " . $element["code"] . "\n";
}
1 голос
/ 19 мая 2010

@ в XPath - это селектор атрибута. Вы пытаетесь выбрать корневой элемент, поэтому он должен быть:

  $el = $this->xml->xpath("/errors");

Если вы хотите выбрать все элементы ошибок, используйте

  $el = $this->xml->xpath("/errors/error");

или

  $el = $this->xml->xpath("//error");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...