Sử dụng SimpleXML để tạo một đối tượng XML từ đầu


77

Có thể sử dụng các hàm SimpleXML của PHP để tạo một đối tượng XML từ đầu không? Nhìn qua danh sách hàm, có nhiều cách để nhập một chuỗi XML hiện có vào một đối tượng mà sau đó bạn có thể thao tác, nhưng nếu tôi chỉ muốn tạo một đối tượng XML theo chương trình từ đầu, thì cách tốt nhất để làm điều đó là gì?

Tôi đã phát hiện ra rằng bạn có thể sử dụng simplexml_load_string () và truyền vào chuỗi gốc mà bạn muốn, và sau đó bạn có một đối tượng mà bạn có thể thao tác bằng cách thêm trẻ em ... mặc dù điều này có vẻ giống như một loại hack, vì tôi phải thực sự hardcode một số XML vào chuỗi trước khi nó có thể được tải.

Tôi đã thực hiện nó bằng cách sử dụng các hàm DOMDocument , mặc dù hơi khó hiểu vì tôi không chắc DOM có liên quan gì đến việc tạo một tài liệu XML thuần túy ... vì vậy có thể nó chỉ được đặt tên không hợp lệ :-)

Câu trả lời:


144

Chắc chắn bạn có thể. Ví dụ.

<?php
$newsXML = new SimpleXMLElement("<news></news>");
$newsXML->addAttribute('newsPagePrefix', 'value goes here');
$newsIntro = $newsXML->addChild('content');
$newsIntro->addAttribute('type', 'latest');
Header('Content-type: text/xml');
echo $newsXML->asXML();
?>

Đầu ra

<?xml version="1.0"?>
<news newsPagePrefix="value goes here">
    <content type="latest"/>
</news>

Chúc vui vẻ.


Giữa câu trả lời này và câu trả lời của @ Stefan và @ PhiLho, điều này có vẻ đơn giản và dễ hiểu nhất. Đồng thời, tôi tự hỏi liệu hiệu suất có khác không. Hai cái kia có mùi như mã nhanh.
Camilo Martin

2
Làm cách nào để lưu tệp này dưới dạng tệp xml trong máy chủ? để làm cho nó có sẵn cho mã hành động của tôi?
shababhsiddique

@dreamwerx Có lẽ tôi đang thiếu điều gì đó tại sao contentthẻ của bạn không được đóng bằng </content>?
Shackrock 19/12/12

1
@Shackrock: nó đã đóng cửa, hãy nhìn vào dấu "/" trước ">" của <content type = "mới nhất" />
Michel

4
Cách thêm một số văn bản giữa các thẻ nội dung. Nói <content> Chà nó hoạt động! </content>
harishannam

21

Trong PHP5, bạn nên sử dụng lớp Mô hình Đối tượng Tài liệu để thay thế. Thí dụ:

$domDoc = new DOMDocument;
$rootElt = $domDoc->createElement('root');
$rootNode = $domDoc->appendChild($rootElt);

$subElt = $domDoc->createElement('foo');
$attr = $domDoc->createAttribute('ah');
$attrVal = $domDoc->createTextNode('OK');
$attr->appendChild($attrVal);
$subElt->appendChild($attr);
$subNode = $rootNode->appendChild($subElt);

$textNode = $domDoc->createTextNode('Wow, it works!');
$subNode->appendChild($textNode);

echo htmlentities($domDoc->saveXML());

1
API DOM rất dài dòng! Tôi rất muốn có thể làm điều gì đó như $elem->append($doc->p('This is a paragraph')); Ngay cả việc nối văn bản là một việc vặt hai dòng. Tôi rất muốn một cái gì đó giống như$elem->append('Some text');
thomasrutter

2
Theo tôi, nó phụ thuộc rất nhiều vào những gì bạn định làm. Nếu bạn muốn có chức năng cơ bản và nhanh chóng, SimpleXML là hoàn hảo! Nhưng dù sao đi nữa: câu hỏi là "Sử dụng SimpleXML để tạo một đối tượng XML từ đầu" - rất lạc đề, xin lỗi.
Stephan Weinhold

16

Hãy xem câu trả lời của tôi tại đây . Như dreamwerx.myopenid.com đã chỉ ra, có thể thực hiện điều này với SimpleXML , nhưng phần mở rộng DOM sẽ là cách tốt hơn và linh hoạt hơn. Ngoài ra, có một cách thứ ba: sử dụng XMLWriter . Nó đơn giản hơn nhiều để sử dụng so với DOM và do đó đó là cách ưa thích của tôi để viết các tài liệu XML từ đầu.

$w=new XMLWriter();
$w->openMemory();
$w->startDocument('1.0','UTF-8');
$w->startElement("root");
    $w->writeAttribute("ah", "OK");
    $w->text('Wow, it works!');
$w->endElement();
echo htmlentities($w->outputMemory(true));

Nhân tiện: DOM là viết tắt của D ocument O bject M odel ; đây là API được chuẩn hóa thành các tài liệu XML.


XMLwriter là tốt nếu bạn đang có ý định xuất trực tiếp ra mã XML mà không cần bất kỳ thao tác nào. Thao tác thêm (di chuyển các phần tử xung quanh, chèn các phần tử) là không thực sự khả thi.
thomasrutter

Liên kết được cập nhật (tôi nghĩ) php.net/manual/en/intro.xmlwriter.php , php.net/manual/en/book.dom.php
chris85
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.