5

我正在尝试从数据库查询中生成 xml。

这是生成的 xml 链接: http: //mydeal.ge/api/xml

但是当我尝试解析这个 xml 时,我得到一个错误:http ://wallsparade.com/test.php 。

我的代码是:

public function xml()
    {
        $res = $this->db->query('custom query');
        if($res->num_rows() > 0)
        {$output =  '<?xml version="1.0"?>'. "\n";
            $output .= "<deals>";
            foreach($res->result() as $item)
        {
            $output .= "<sale id = '".$item->id."'>";
            $output .= "<link>".$item->link."</link>";
            $output .= "<title>".urlencode($item->title)."</title>";
            $output .= "<image>".$item->image."</image>";
            $output .= "<text>".urlencode($item->text)."</text>";
            $output .= "<time>".$item->time."</time>";
            $output .= "<price>".$item->price."</price>";
            $output .= "<parcent>".$item->parcent."</parcent>";
            $output .= "</sale>";
        }
        $output .= '</deals>';
        }

        echo $output;

    }

什么是问题?

4

4 回答 4

3

看起来你正在开发一个 API。为什么不使用 CodeIgniter 的 RESTServer 插件?

这一切都为您处理,您不必担心格式。您可以选择以 JSON 或 XML 格式输出。

Phil 开发的插件:https ://github.com/philsturgeon/codeigniter-restserver

于 2013-07-26T10:10:08.210 回答
2

我相信生成 XML 的最实用、合乎逻辑且无错误的方法是DOMDocument按照 Eineki 在此答案中的建议创建一个,允许通过 xpath 查询搜索 xmltree。

话虽如此,几年前Dan Simmons 创建了一个 MY_xml_helper.php,您可以直接将其复制到您的application/helpers文件夹中。这是没有注释的整个代码:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( ! function_exists('xml_dom'))
{
	function xml_dom()
	{
		return new DOMDocument('1.0', 'UTF-8');
	}
}

if ( ! function_exists('xml_add_child'))
{
	function xml_add_child($parent, $name, $value = NULL, $cdata = FALSE)
	{
		if($parent->ownerDocument != "")
		{
			$dom = $parent->ownerDocument;			
		}
		else
		{
			$dom = $parent;
		}
		
		$child = $dom->createElement($name);		
		$parent->appendChild($child);
		
		if($value != NULL)
		{
			if ($cdata)
			{
				$child->appendChild($dom->createCdataSection($value));
			}
			else
			{
				$child->appendChild($dom->createTextNode($value));
			}
		}
		
		return $child;		
	}
}


if ( ! function_exists('xml_add_attribute'))
{
	function xml_add_attribute($node, $name, $value = NULL)
	{
		$dom = $node->ownerDocument;			
		
		$attribute = $dom->createAttribute($name);
		$node->appendChild($attribute);
		
		if($value != NULL)
		{
			$attribute_value = $dom->createTextNode($value);
			$attribute->appendChild($attribute_value);
		}
		
		return $node;
	}
}


if ( ! function_exists('xml_print'))
{
	function xml_print($dom, $return = FALSE)
	{
		$dom->formatOutput = TRUE;
		$xml = $dom->saveXML();
		if ($return)
		{
			return $xml;
		}
		else
		{
			echo $xml;
		}
	}
}

请注意,您将编码设置为:new DOMDocument('1.0', 'UTF-8');. 这是一个例子:

$this->load->helper('xml');
$dom = xml_dom();
$book = xml_add_child($dom, 'book');
xml_add_child($book, 'title', 'Hyperion');
$author = xml_add_child($book, 'author', 'Dan Simmons');        
xml_add_attribute($author, 'birthdate', '1948-04-04');
xml_add_child($author, 'name', 'Dan Simmons');
xml_add_child($author, 'info', 'The man that wrote MY_xml_helper'); 
xml_print($dom);

只会输出:

<?xml version="1.0" encoding="UTF-8"?>
<book>
    <title>Hyperion</title>
    <author birthdate="1948-04-04">
     <name>Dan Simmons</name>
     <info>The man that wrote MY_xml_helper</info>
    </author>
</book>

xml_print要么s要么echo返回。$xml->saveXML()

注意:您仍然可以使用来自 CodeIgniter 的默认 XML 帮助器中唯一的一个函数:它只xml_convert("<title>'Tom' & \"Jerry\"")输出:&lt;title&gt;&apos;Tom&apos; &amp; &quot;Jerry&quot;

于 2015-07-22T12:06:49.467 回答
1

您的 XML 文档必须以:

<?xml version="1.0"?>

没有白色符号没有“空格”没有“输入”。您的文档以换行符开头,如错误消息所示:

Warning: simplexml_load_file() [function.simplexml-load-file]: http://mydeal.ge/api/xml:2: parser error : XML declaration allowed only at the start of the document in /home1/stinky/public_html/test.php on line 2

并从此行删除空格:

$output .= "<sale id = '".$item->id."'>";
$output .= "<sale id='".$item->id."'>";
于 2013-07-25T09:41:03.690 回答
0

当您拥有诸如SimpleXMLElement之类的内置库时,您不应该通过字符串连接来编写 XML 。

尝试将您的代码更改为此。我自己无法测试它,但它应该可以按预期工作:

<?php
public function xml()
{
    $res = $this->db->query('custom query');
    if ($res->num_rows() > 0) {
        $sxe   = new SimpleXMLElement();
        $deals = $sxe->addChild('deals');

        foreach($res->result() as $item) {
            $sale = $deals->addChild('sale');
            $sale->addAttribute('id', $item->id);
            $sale->addChild('link', $item->link);
            $sale->addChild('title', urlencode($item->title));
            $sale->addChild('image', $item->image);
            $sale->addChild('text', urlencode($item->text));
            $sale->addChild('time', $item->time);
            $sale->addChild('price', $item->price);
            $sale->addChild('parcent', $item->parcent);
        }
    }

    echo $sxe->saveXML();
}
于 2013-07-25T09:54:17.603 回答