2012-05-24 130 views
1

我一直在一个项目中显示XML文件中的数据。 (这有点像一个API)。我知道如何用PHP解析XML,以及如何在PHP中创建XML文件,但它们不能一起工作。 :)将PHP文件解析为XML文件?

基本上,我有两个文件:parse.phpxml.php

xml.php抓住从MySQL数据库信息,并将它作为XML。

parse.php加载并解析xml.php并将其输出为HTML。

如果我运行parse.php,它不会加载xml.php。但是,如果我复制输出的XML(从xml.php)并将其另存为xml.xml文件(并将parse.php中的文件名更改为'xml.xml'),它将起作用。我非常感谢任何帮助。 parse.php的

内容:xml.php的

<?php 

    $doc = "xml.php"; 

    $doc = @simplexml_load_file($doc) or die("Server Error: Recipe not found!"); 

    $title = $doc->title; 

    echo $title 

?> 

内容:

<?php 

    header("Content-type: text/xml"); 

    $dbc = mysql... //gets data from database 

    echo "<!DOCTYPE..."; //xml stuff here 

    echo "<title>" . $dataFromMySQL . "</title>"; 

?> 

数据库连接的工作原理,并在XML中的DOCTYPE是确定的,所以这不是问题。

同样,当我使用动态生成的PHP XML我只得到这个问题。如果它是一个.XML文件,它可以正常工作。

任何人都可以帮助我吗?

谢谢。

+0

你应该把你的xml生成代码编写成一个函数 - 在你将要处理的程序文件中加载include,然后调用该函数来获取xml内容。你试图做的是一团糟。 – jsbueno

回答

3
@simplexml_load_file($doc); 

那是你的问题。这不会执行xml.php,但会尝试将该文件(即您编写的PHP代码)解析为XML。显然(因为它不是XML),这是行不通的。

您必须找到一种方法,将执行xml.php的输出转换为parse.php

最简单的方法来做到这将是所有echo通话变成$xml .=电话,并简单地includexml.phpparse.php

// xml.php 
$xml = ''; 
$xml .= "<!DOCTYPE..."; //xml stuff here 

$output .= "<title>" . $dataFromMySQL . "</title>"; 

// parse.php 
include('xml.php'); 

simplexml_load_string($xml); 

请注意,您的问题就在这里显示的是使用错误抑制操作@的愚蠢。如果你没有使用它,PHP会告诉你各种错误,这将有助于你意识到问题所在。


附录:它发生,我认为最好的办法实际上是忘记了沿途的无谓XML步骤,而直接在数据库输出转换成HTML。

+0

这确实很好! Caleb – Caleb

+0

@Caleb没有理由不能将数据获取到一个文件和两个使用数据的文件中,一个文件将其转换为HTML,另一个文件转换为XML。这就是所谓的分离问题,是良好编码实践的基础之一。 – lonesomeday

+0

太棒了!非常感谢大家快速(且有帮助)的回复! – Caleb

5

simplexml_load_file将尝试实际加载xml.php文件的PHP内容。它不会首先运行该文件。你需要做一些改写或使用该丑陋的解决方案:

ob_start(); 
include 'xml.php'; 
$xml = ob_get_clean(); 

$doc = simplexml_load_string($xml); 
//... 

注:我喜欢@ lonesomeday提出的更好的解决方案,它只是需要更多的重写。

+0

这工作得很好!谢谢! – Caleb

1

如果你想这样做,而无需重写xml.php,你可以通过PHP通过URL访问,以处理文件:

$doc = file_get_contents("http://localhost/xml.php"); 
+0

假设你想这样做而不重写'xml.php',使用[Explosion Pills's answer](http://stackoverflow.com/a/10743053/417562)。用'file_get_contents'做这件事(做一个不必要的HTTP请求并且大大减慢你的页面速度)是一个非常糟糕的方法。 – lonesomeday

0

你从字面上加载本地文件。除非您评估它,否则代码不会运行,因此您只需获取代码本身。

您可以使用CURL通过HTTP下载xml.php,或者您可以使xml.php的XML生成组件成为您可以简单包含并执行的可调用函数。

parse.php:

<?php 
    include('xml.inc'); 

    $doc = @simplexml_load_string(xml_function()) or die("Error"); 
    echo $doc->title; 

xml.php:

<?php 
    include('xml.inc'); 

    header("Content-type: text/xml"); 
    echo xml_function(); 

xml.inc:

<?php 
    function xml_function() { 
    $dbc = mysql... //gets data from database 
    $xml = "<!DOCTYPE..."; //xml stuff here 
    $xml .= "<title>" . $dataFromMySQL . "</title>"; 
    return $xml; 
    } 

但是......即使这似乎傻了,说实话,当你可以将两种输出方法连接到相同的数据并跳过生成/解析步骤。有条件地输出HTML/XML。

+0

另外,生成XML不会生成看起来像XML的字符串。使用DOM。 – lotyrin

0

只需使用嵌入字符串的mysql函数,无需编写代码在您的计算机上运行,​​使您的mysql服务器完成所有工作。

SUBSTRING(page, INSTR(page, '<title>')+7,(INSTR(page, '</title>'))-(INSTR(page, '<title>')+7) )

例子

UPDATE SET URL2标题= SUBSTRING(页面,INSTR(页面, '')7,(INSTR(页面, '')) - (INSTR(页面, '' )7))

或通过

SELECT SUBSTRING(页面,INSTR(页面, '')7,(INSTR(页面, ''))测试 - (INSTR(页面, '')+ 7)),页 FROM URL2 其中URL = 'http://en.wikipedia.org/wiki/File:Nag_Nathaiya_festival_in_Varanasi.jpg';