如何将POST数据加载到SimpleXML中?

时间:2012-12-19 16:41:56

标签: php jquery ajax simplexml

我需要将textarea输入中的XML数据发布到PHP,这样我就可以解析它并输出一个表。

我尝试了一些方法,但似乎都没有。

目前我有这个:

jQuery('#btnRegistrarXML').live('click', function(){
var xml;

if (jQuery('#txtRegXML').val() == ""){
  AddMsg('You must paste XML from the excel export into the textarea.', 'error');
} else {
  jQuery.post('registrar-xml-to-table.php', {xml:escape(jQuery('#txtRegXML').val())}, function(data){
    jQuery('#regXMLasTable').empty();
    jQuery('#regXMLasTable').append(data);
  });
}

displayMsgs();
});

PHP是:

$xmlraw = urldecode($_POST['xml']);

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xmlraw);
$dom->formatOutput = TRUE;
$xmlstr = $dom->saveXml();

$xml = simplexml_load_string($xmlstr);
echo "<p>xmlraw:</p>";
echo $xmlraw;
echo "<p>xml:</p>";
echo $xml;

foreach ($xml->document as $doc) {
  echo '<p class="alert alert-error">'.$doc->title.'</p>';
}

第一个echo $ xmlraw正在运行 - 它在一行中输出所有XML字符串 - 帖子正在通过正确的方式发送数据。

第二个echo $ xml没有输出任何东西,foreach也没有输出任何东西 - 某些东西在PHP中不起作用

我也尝试将$ xmlraw直接加载到simplexml_load_string($ xmlraw)中,但它不起作用 - 我假设因为它没有很好地形成?

我用来测试的XML是:

<?xml version="1.0"?>
<document>
  <title>
    Foobar
  </title>
</document>

您可以将XML粘贴到此(http://tsdexter.com/webservice-testing/programs-list.php)页面上的textarea中,然后检查xmlraw下面的元素:您可以看到原始xml字符串已被回显 - 但是,在xml下面:没有任何内容foreach也没有输出任何东西。

这是一个jsFiddle,所以你可以看到HTML / JS - 它实际上并没有做任何事情,因为它不能ajax到PHP页面 - 所以我包括上面的PHP版本进行测试。 http://jsfiddle.net/tsdexter/EDqQB/

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

一些问题,可能会或可能不会构成答案,但需要比评论更多的空间。

  1. 您为什么在urldecode变量上运行$_POST? PHP应该为你做这件事,除非你在某个地方双重逃避它。
  2. 为什么要加载到DOM然后加载SimpleXML?我知道你说你没有试过,但是他们在下面使用相同的XML解析器,所以这没有办法帮助你而不是引入更多的混乱。
  3. var_dump(simplexml_load_string($rawxml))给你什么?我的猜测是假的,这意味着错误。在这种情况下,请检查您是否已启用警告(error_reporting(E_ALL); ini_set('display_errors', '1');)并关闭detailed XML error handlinglibxml_use_internal_errors(false);)。
  4. 如果它确实为您提供了SimpleXMLElement对象,请不要花太多时间查看var_dump输出。请改为one of these debugging functions