将xml从字符串加载到数组时出现未定义的错误

时间:2014-08-29 16:54:44

标签: php xml

我有一个非常简单的xml,我通过POST从桌面应用程序收到:

<?xml version="1.0" encoding="utf-8"?>
<root>
<receipt status="1" id="PAR/2" idreceipt="1" date="YYMMDD" errorstr="" />
<receipt status="1" id="PAR/2/2" idreceipt="2" date="YYYY-MM-DD HH:II:SS" errorstr="" />
<receipt status="0" id="PAR/2/3" idreceipt="3" date="YYYY-MM-DD HH:II:SS" errorstr="ERROR" />
</root>

我将其保存到变量中,然后尝试使用simplexml_load_string($string)将其加载到数组中。 var_dump($xml)返回false。我知道没有内容,但是当我在每个收据上使用print_r尝试foreach属性时,它也是空的。 xml是不是格式正确,还是我在PHP中遗漏了什么?

整个PHP:

$string = $_POST['results'];
$xml = simplexml_load_string($string);
foreach ($xml->receipt as $value) {
print_r($value);
} 

2 个答案:

答案 0 :(得分:0)

解析XML时出现问题 我尝试了以下代码(使用http://php.net/manual/en/function.libxml-get-errors.php中的一些代码):

<?php

libxml_use_internal_errors(true);

$string = $_POST['results'];

$loaded_xml = simplexml_load_string($string);
$xml = explode("\n", $string);

$errors = libxml_get_errors();

foreach ($errors as $error) {
    echo display_xml_error($error, $xml);
}

foreach ($loaded_xml->receipt as $value) {
  print_r($value);
}

function display_xml_error($error, $xml)
{
    $return  = $xml[$error->line - 1] . "\n";
    $return .= str_repeat('-', $error->column) . "^\n";

    switch ($error->level) {
        case LIBXML_ERR_WARNING:
            $return .= "Warning $error->code: ";
            break;
         case LIBXML_ERR_ERROR:
            $return .= "Error $error->code: ";
            break;
        case LIBXML_ERR_FATAL:
            $return .= "Fatal Error $error->code: ";
            break;
    }

    $return .= trim($error->message) .
               "\n  Line: $error->line" .
               "\n  Column: $error->column";

    if ($error->file) {
        $return .= "\n  File: $error->file";
    }

    return "$return\n\n--------------------------------------------\n\n";
}

我犯了很多错误。以下是前两个:

<?xml version=\"1.0\" encoding=\"utf-8\"?> <root> <receipt status=\"1\" id=\"PAR/2\" idreceipt=\"1\" date=\"YYMMDD\" errorstr=\"\" /> <receipt status=\"1\" id=\"PAR/2/2\" idreceipt=\"2\" date=\"YYYY-MM-DD HH:II:SS\" errorstr=\"\" /> <receipt status=\"0\" id=\"PAR/2/3\" idreceipt=\"3\" date=\"YYYY-MM-DD HH:II:SS\" errorstr=\"ERROR\" /> </root>
--------------^
Fatal Error 33: String not started expecting ' or "
  Line: 1
  Column: 14

--------------------------------------------

<?xml version=\"1.0\" encoding=\"utf-8\"?> <root> <receipt status=\"1\" id=\"PAR/2\" idreceipt=\"1\" date=\"YYMMDD\" errorstr=\"\" /> <receipt status=\"1\" id=\"PAR/2/2\" idreceipt=\"2\" date=\"YYYY-MM-DD HH:II:SS\" errorstr=\"\" /> <receipt status=\"0\" id=\"PAR/2/3\" idreceipt=\"3\" date=\"YYYY-MM-DD HH:II:SS\" errorstr=\"ERROR\" /> </root>
--------------^
Fatal Error 96: Malformed declaration expecting version
  Line: 1
  Column: 14

--------------------------------------------

现在,根据this post这可能是由于magic_quotes_runtime在你...时添加反斜杠引起的。

所以,我认为这可以解决你的问题:

<?php

libxml_use_internal_errors(true);

$string = $_POST['results'];

$string = stripslashes($string);

$loaded_xml = simplexml_load_string($string);
// rest of the code is the same as above

答案 1 :(得分:0)

所以我已经尝试了很多东西 - 使用Ako提供的解决方案重新安装模块,但它没有用。事实证明,我的服务器在处理POST时将每个特殊字符转换为字符实体,并且解析器没有将字符串识别为具有&lt;&gt;而非实际< {的有效XML。 {1}}所以我补充道:

>

它完美无缺。希望这有助于其他人!