Làm cách nào để tạo tệp XML động bằng PHP?


232

Tôi phải tạo một tệp xml một cách linh hoạt khi chạy. Xin hãy giúp tôi tạo ra tệp XML bên dưới một cách linh hoạt bằng PHP.

<?xml version="1.0" encoding="UTF-8"?>
<xml>
 <track>
     <path>song1.mp3</path>
     <title>Track 1 - Track Title</title>
 </track>
 <track>
     <path>song2.mp3</path>
     <title>Track 2 - Track Title</title>
 </track>
 <track>
     <path>song3.mp3</path>
     <title>Track 3 - Track Title</title>
 </track>
 <track>
     <path>song4.mp3</path>
     <title>Track 4 - Track Title</title>
 </track>
 <track>
     <path>song5.mp3</path>
     <title>Track 5 - Track Title</title>
 </track>
 <track>
     <path>song6.mp3</path>
     <title>Track 6 - Track Title</title>
 </track>
 <track>
     <path>song7.mp3</path>
     <title>Track 7 - Track Title</title>
 </track>
 <track>
     <path>song8.mp3</path>
     <title>Track 8 - Track Title</title>
 </track>


1
Ngoài ra, remebmber, xml 1.0 không được hỗ trợ bởi tất cả các công cụ tìm kiếm. Tôi khuyên bạn nên xml 0.9 vì đây là phiên bản xml được biết đến nhiều nhất!
Domuta Marcel

Tạo tệp XML bằng PHP và MySQL - kvcodes.com/2017/03/generate-xml-file-USE-php-mysql
Kvvaradha

1
@Kvvaradha đó không phải là một giải pháp tốt
robertmain

Câu trả lời:


358

Tôi sẽ sử dụng SimpleXMLEuity .

<?php

$xml = new SimpleXMLElement('<xml/>');

for ($i = 1; $i <= 8; ++$i) {
    $track = $xml->addChild('track');
    $track->addChild('path', "song$i.mp3");
    $track->addChild('title', "Track $i - Track Title");
}

Header('Content-type: text/xml');
print($xml->asXML());

12
Có thể chỉ định mã hóa với SimpleXml? Làm thế nào nó có thể được thực hiện?
Eineki

1
Xin chào, tôi đã thử ví dụ của bạn nhưng trong quá trình xác nhận tôi nhận được 2 cảnh báo. Làm thế nào để xóa chúng? validator.w3.org/ Kẻ
Satya

3
@Eineki chỉ cần thêm <?xml version="1.0" encoding="WHATEVER_IT_IS"?>hướng dẫn xử lý. Tôi tin rằng, SimpleXMLEuity sẽ thực hiện đúng: chuyển đổi tất cả các giá trị chuỗi được truy vấn sang mb_iternal_encoding của bạn.
Ivan Krechetov

33
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><Person></Person>");
kebyang

Tôi nhận được 'lỗi trên dòng 2 ở cột 6: Chỉ khai báo XML khi bắt đầu tài liệu'; mã thêm dòng trống bổ sung ở đầu xml gây ra lỗi phân tích cú pháp.
Elia Weiss

179

Để tạo một XMLdocument trong PHP, bạn nên thể hiện một lớp DOMDocument, tạo các nút con và nối các nút này trong nhánh chính xác của cây tài liệu.

Để tham khảo, bạn có thể đọc http://it.php.net/manual/en/book.dom.php

Bây giờ chúng tôi sẽ có một chuyến tham quan nhanh về mã dưới đây.

  • tại dòng 2, chúng tôi tạo một tài liệu xml trống (chỉ định phiên bản xml (1.0) và mã hóa (utf8))
  • bây giờ chúng ta cần điền vào cây xml:
    • Chúng ta phải tạo một xmlnode (dòng 5)
    • và chúng ta phải nối cái này vào đúng vị trí. Chúng tôi đang tạo root để chúng tôi nối nó trực tiếp vào domdocument.
    • Lưu ý tạo phần tử nối phần tử vào nút và trả lại nút được chèn, chúng tôi lưu tham chiếu này để nối các nút theo dõi vào nút gốc (được gọi ngẫu nhiên là xml).

Đây là những điều cơ bản, bạn có thể tạo và nối một nút chỉ trong một dòng (ví dụ thứ 13), bạn có thể làm rất nhiều thứ khác với dom api. Điều đó phụ thuộc vào bạn.

<?php    
    /* create a dom document with encoding utf8 */
    $domtree = new DOMDocument('1.0', 'UTF-8');

    /* create the root element of the xml tree */
    $xmlRoot = $domtree->createElement("xml");
    /* append it to the document created */
    $xmlRoot = $domtree->appendChild($xmlRoot);

    $currentTrack = $domtree->createElement("track");
    $currentTrack = $xmlRoot->appendChild($currentTrack);

    /* you should enclose the following two lines in a cicle */
    $currentTrack->appendChild($domtree->createElement('path','song1.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song1.mp3'));

    $currentTrack->appendChild($domtree->createElement('path','song2.mp3'));
    $currentTrack->appendChild($domtree->createElement('title','title of song2.mp3'));

    /* get the xml printed */
    echo $domtree->saveXML();
?>

Chỉnh sửa: Chỉ là một gợi ý khác: Ưu điểm chính của việc sử dụng xmldocument (tài liệu dom hoặc đơn giản) thay vì in xml, là xmltree có thể tìm kiếm được bằng truy vấn xpath


6
tôi có thể sử dụng lại $domtree->save('mypath/xmlfile.xml');không?
guitarlass

1
@g Ức Bạn nói đúng. savesaveXML tương tự nhau: lần đầu tiên kết xuất xmltree vào một tệp, lần thứ hai thành một chuỗi (và bạn có thể lưu nó trong bước tiếp theo với các chỉ thị lưu tệp thông thường).
Eineki

4
@jjonesdesign Bạn phải làm việc chăm chỉ để có được kiến ​​thức cần thiết để lười biếng :)
Eineki

1
Ví dụ tạo một dòng dài thay vì phá vỡ bởi các phần tử XML. Bạn cần thêm $domtree->formatOutput = true;để làm cho đầu ra đẹp :)
JackTheKnife

1
@Drenyl thêm tiêu đề loại nội dung phù hợp và a Content-Disposition: attachmentvà in kết quả saveXml. Bạn cũng có thể đề xuất một tên tệp.
Eineki

27

Một cách dễ dàng để làm điều này là:

<?php
// Send the headers
header('Content-type: text/xml');
header('Pragma: public');
header('Cache-control: private');
header('Expires: -1');
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";

echo '<xml>';

// echo some dynamically generated content here
/*
<track>
    <path>song_path</path>
    <title>track_number - track_title</title>
</track>
*/

echo '</xml>';

?>

lưu nó dưới dạng .php


18
dễ dàng, nhưng dễ bị lỗi khi các biến được nội suy có các siêu ký tự XML trong đó như dấu ngoặc nhọn và ký hiệu góc
Matthew Lock

15

Với FluidXML, bạn có thể tạo XML của mình rất dễ dàng.

$tracks = fluidxml('xml');

$tracks->times(8, function ($i) {
    $this->add([
        'track' => [
            'path'  => "song{$i}.mp3",
            'title' => "Track {$i} - Track Title"
        ]
    ]);

});

https://github.com/servo-php/fluidxml


2
FluidXML trong bản phát hành cuối cùng hỗ trợ PHP 5 .
Daniele Orlando

4
Một thư viện bên ngoài để làm một cái gì đó có thể dễ dàng thực hiện trong PHP gốc với SimpleXML không phải là giải pháp.
robertmain

4

Hãy nhìn vào hệ thống templating Tiny nhưng mạnh mẽ . Nó thường được sử dụng để tạo khuôn mẫu HTML nhưng có phần mở rộng hoạt động với các tệp XML. Tôi sử dụng rộng rãi điều này để tạo báo cáo trong đó tôi có thể có một tệp mã và hai tệp mẫu - htm và xml - và sau đó người dùng có thể chọn gửi báo cáo tới màn hình hoặc bảng tính.

Một ưu điểm khác là bạn không phải mã hóa xml từ đầu, trong một số trường hợp tôi muốn xuất bảng tính phức tạp rất lớn và thay vì phải mã hóa tất cả việc xuất tất cả những gì cần thiết là lưu bảng tính hiện có vào xml và thay thế trong các thẻ mã nơi yêu cầu đầu ra dữ liệu. Đó là một cách nhanh chóng và rất hiệu quả để làm việc.


-13
$query=mysql_query("select * from tablename")or die(mysql_error()); 
$xml="<libraray>\n\t\t";
while($data=mysql_fetch_array($query))
{

    $xml .="<mail_address>\n\t\t";
    $xml .= "<id>".$data['id']."</id>\n\t\t";
    $xml .= "<email>".$data['email_address']."</email>\n\t\t";
    $xml .= "<verify_code>".$data['verify']."</verify_code>\n\t\t";
    $xml .= "<status>".$data['status']."</status>\n\t\t";
    $xml.="</mail_address>\n\t";
}
$xml.="</libraray>\n\r";
$xmlobj=new SimpleXMLElement($xml);
$xmlobj->asXML("text.xml");

Nó đơn giản chỉ cần kết nối với cơ sở dữ liệu của bạn, nó sẽ tạo tệp test.xml trong thư mục dự án của bạn


26
Đây là loại mã không bao giờ nên xem sản xuất. Tùy thuộc vào dữ liệu bạn đưa ra, bạn có thể tạo XML không hợp lệ (nghĩa là không thể xem được). Nó cẩu thả nhất, và mặc dù nó có vẻ dễ dàng vì bạn có thể tiết kiệm một vài dòng mã, nó sẽ khiến bạn tốn nhiều tiền hơn về mặt bảo trì và gỡ lỗi; không đề cập đến anh chàng nghèo, người một ngày nào đó có thể đảm nhận trách nhiệm công việc của bạn.
Arne

3
-1 trước tiên kết hợp một chuỗi với một số wanna-be-xml, sau đó đẩy chuỗi đó vào SimpleXML - Cái này trông như bị lộn ngược. Thay vào đó, trước tiên hãy khởi tạo đối tượng thư viện XML, sau đó sử dụng nó để xây dựng XML. Nó dễ dàng hơn, sử dụng ít bộ nhớ hơn, ít bị lỗi hơn và cho phép bạn truyền trực tiếp XML sang tệp hoặc thiết bị xuất chuẩn.
hakre

2
Có lẽ đã đến lúc xóa câu trả lời này (và bạn sẽ lấy lại danh tiếng đã mất!).
Jose Manuel Abarca Rodríguez

Tôi nghĩ nó nên ở lại. Tôi đã tự tạo một số mã lần đầu tiên làm việc với XML và nó trông hơi giống thế này, vì vậy rất hữu ích khi xem những gì KHÔNG nên làm.
Peter Højlund Andersen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.