2012-05-24 129 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';