2010-01-26 27 views
6

Tôi đang sử dụng SimpleXML để xây dựng một tài liệu, và tự hỏi liệu nó có thể chèn thẻ bình luận cho tài liệu như thế này:Có thể chèn thẻ nhận xét vào xml bằng simplexml không?

<root> 
    <!-- some comment --> 
    <value> 
</root> 

EDIT:

Các bình luận là ở đâu đó ở giữa tài liệu.

<root> 
    <tag1 /> 
    <!-- some comment --> 
    <value /> 
</root> 

Trả lời

4

Thật không may, SimpleXML không xử lý nhận xét. Như đã đề cập, DOM xử lý các nhận xét nhưng đó là một loại phiền toái để sử dụng cho các công cụ đơn giản, so với SimpleXML.

Đề xuất của tôi: thử SimpleDOM. Đó là một phần mở rộng cho SimpleXML, vì vậy mọi thứ hoạt động như nhau và nó có một loạt các phương thức hữu ích để xử lý các công cụ DOM.

Ví dụ: insertComment($content, $mode) có thể append hoặc chèn nhận xét before hoặc after một nút nhất định. Ví dụ:

include 'SimpleDOM.php'; 

$root = simpledom_load_string('<root><value/></root>'); 

$root->value->insertComment(' mode: append ', 'append'); 
$root->value->insertComment(' mode: before ', 'before'); 
$root->value->insertComment(' mode: after ', 'after'); 

echo $root->asPrettyXML(); 

... sẽ echo

<?xml version="1.0"?> 
<root> 
    <!-- mode: before --> 
    <value> 
    <!-- mode: append --> 
    </value> 
    <!-- mode: after --> 
</root> 
+0

Cảm ơn Josh, tôi cũng thấy hữu ích. Không nghe nói về thư viện đó trước đây. – halfer

4

Nope, nhưng dường như bạn có thể use DomDocument as a workaround (german):

$oNodeOld = dom_import_simplexml($oParent); 
    $oDom = new DOMDocument(); 
    $oDataNode = $oDom->appendChild($oDom->createElement($sName)); 
    $oDataNode->appendChild($oDom->createComment($sValue)); 
    $oNodeTarget = $oNodeOld->ownerDocument->importNode($oDataNode, true); 
    $oNodeOld->appendChild($oNodeTarget); 
    return simplexml_import_dom($oNodeTarget); 

Nhưng sau đó một lần nữa, tại sao không sử dụng DOM trực tiếp?

3

Có thực sự là một thủ thuật bẩn, dựa trên thực tế rằng addChild không kiểm tra nếu tên nguyên tố là hợp lệ:

$root->addChild('!-- Your comment --><dummy'); 

Khi sử dụng $root->asXML() bạn sẽ nhận được một chuỗi như sau:

<root><!-- Your comment --><dummy/></root> 

Bạn có thể nhận thấy nó cũng tạo ra một phần tử trống <dummy>, nhưng đó là giá phải trả. Đừng cố gắng thêm một giá trị, nó sẽ chỉ làm mọi thứ lộn xộn. Chỉ sử dụng chỉ kết hợp với asXML().

Vâng, tôi đã làm nói đó là một mẹo bẩn. Tôi không khuyên bạn nên sử dụng trong sản xuất, nhưng chỉ cho mục đích gỡ lỗi/thử nghiệm.

+0

Có lỗi đánh máy trong lệnh đầu tiên của bạn (thiếu '<' trước, '!') Không? – beroe

+0

@beroe Không, nó chính xác như vậy. Cứ thử đi. – MaxArt

+0

OK, tuyệt. Tôi thấy bây giờ nó được bọc trong '< /> 'cung cấp các dấu ngoặc" còn thiếu ". Bí quyết bẩn thỉu thực sự: ^) – beroe

Các vấn đề liên quan