我需要使用簡單XML加載XML源,將所有子級複製現有節點,然後在呈現XML之前自定義此新節點的屬性。任何建議?PHP - 使用簡單XML重複XML節點
1
A
回答
18
SimpleXML無法做到這一點,所以你必須使用DOM。好消息是DOM和SimpleXML是同一枚硬幣libxml的兩面。所以不管你使用的是SimpleXML還是DOM,你都在使用同一棵樹。這裏有一個例子:
$thing = simplexml_load_string(
'<thing>
<node n="1"><child/></node>
</thing>'
);
$dom_thing = dom_import_simplexml($thing);
$dom_node = dom_import_simplexml($thing->node);
$dom_new = $dom_thing->appendChild($dom_node->cloneNode(true));
$new_node = simplexml_import_dom($dom_new);
$new_node['n'] = 2;
echo $thing->asXML();
如果你正在做那種事很多,你可以嘗試SimpleDOM,這是一個擴展的SimpleXML,可以讓你直接使用DOM的方法,沒有從和轉換DOM對象。
include 'SimpleDOM.php';
$thing = simpledom_load_string(
'<thing>
<node n="1"><child/></node>
</thing>'
);
$new = $thing->appendChild($thing->node->cloneNode(true));
$new['n'] = 2;
echo $thing->asXML();
3
使用SimpleXML,我找到的最佳方法是解決方法。這是非常BOBO,但它的工作原理:
// Strip it out so it's not passed by reference
$newNode = new SimpleXMLElement($xml->someNode->asXML());
// Modify your value
$newnode['attribute'] = $attValue;
// Create a dummy placeholder for it wherever you need it
$xml->addChild('replaceMe');
// Do a string replace on the empty fake node
$xml = str_replace('<replaceMe/>',$newNode->asXML(),$xml->asXML());
// Convert back to the object
$xml = new SimpleXMLElement($xml); # leave this out if you want the xml
由於它是一種功能,似乎並不在那裏SimpleXML中的一種解決方法,你需要知道,我希望這將打破任何對象引用你我們已經定義了這一點,如果有的話。
+0
喜歡這個答案,很簡單,效果很棒。我不得不稍微調整一下這個答案,因爲'$ newNode-> asXML()'寫出了XML頭部,而不是原始的XML片段: $ domNode = dom_import_simplexml($ newNode); $ xml = str_replace('
相關問題
- 1. PHP XML XPath - 停止重複節點
- 2. 可重複使用的XML節點
- 3. 使用PHP重命名XML節點
- 4. XML flaten重複節點
- 5. XML中的重複節點
- 6. XML ::簡單的XML節點變成了'name'節點的值
- 7. 如何解析XML節點使用XML ::簡單和perl
- 8. 使用PHP簡單的XML
- 9. 將XML節點複製到XML節點集合(PHP)
- 10. XML遍歷,複製單元和節點使用LINQ to XML
- 11. 用於簡單xml節點字符串的Android XML解析器
- 12. 節點 - 簡單的XML API請求
- 13. XML ::簡單不抓取單個XML節點
- 14. 用於PHP的最簡單的XML節點編輯器
- 15. 刪除節點不適用於簡單XML(PHP)
- 16. 用PHP刪除XML節點
- 17. xml解析重複名稱的節點
- 18. XML Praser:檢測重複節點
- 19. ř編程XML:訪問重複節點
- 20. XML重複節點幫助需要
- 21. 確定重複的Xml節點
- 22. XSLT - 從XML創建重複節點
- 23. XML序列化C#,重複的節點
- 24. 獲取XML中重複節點的值?
- 25. 用PHP解析XML。重複節點名稱
- 26. PHP XML複製節點間的元素
- 27. IN XML調節重複使用XSLT
- 28. Perl的XML ::簡單的重複元素
- 29. 在PHP中重命名XML DOM節點
- 30. 使用c重命名xml根節點#
+1用於推薦DOM。我用simpleXML遇到了很多問題。不要使用SimpleXML,DOM功能更強大,並且不會更難使用。 – Keyo
我必須注意到它也是因爲這非常重要。我並不抱歉花了半個小時用DOM重寫我的腳本。現在它更直接,更容易維護。 – ivkremer