美好的一天,
我需要帮助PHP和DOM操作/排序的小条件案例应用程序。基本上我需要帮助一个适当的" appendAfter"根据我的知识,PHP DOMNode只有" appendBefore"。
我有一个类似下面的XML文件,我正在使用PHP Web界面添加/删除元素。
<shelf>
<shelf-id>1</shelf-id>
<somerandomthings>xyz</somerandomthings>
<!-- AAAAAAAAAAAAAAAAAAAA -->
<book>
<book-name>Alphabets</book-name>
<book-color>Rainbow</book-color>
</book>
<book>
<book-name>Animals</book-name>
<book-color>Orange</book-color>
</book>
<!-- BBBBBBBBBBBBBBBBBBBB -->
<book>
<book-name>Boats</book-name>
<book-color>Green</book-color>
</book>
<!-- CCCCCCCCCCCCCCCCCCCC -->
<book>
<book-name>Cars</book-name>
<book-color>Red</book-color>
</book>
<!-- DDDDDDDDDDDDDDDDDDDD -->
<!-- EEEEEEEEEEEEEEEEEEEE -->
<!-- ETC...ETC...ETC..ETC -->
<!-- PPPPPPPPPPPPPPPPPPPP -->
<book>
<book-name>Planes</book-name>
<book-color>Blue</book-color>
</book>
<book>
<book-name>Planets</book-name>
<book-color>Silver</book-color>
</book>
<!-- TTTTTTTTTTTTTTTTTTTT -->
<book>
<book-name>Trees</book-name>
<book-color>Brown</book-color>
</book>
<!-- RRRRRRRRRRRRRRRRRRRR -->
<book>
<book-name>Reptiles</book-name>
<book-color>Green</book-color>
</book>
<!-- ZZZZZZZZZZZZZZZZZZZZ -->
<somemorerandomthings>xyz</somemorerandomthings>
</shelf>
由于此文件具有严格的&#34;允许&#34;标签我决定使用注释来标出各个部分。 (为我的OCD提供课程)即
<!-- AAAAAAAAAAAAAAAAAAA -->
将标记所有书名以&#34; A&#34;开头的地方。按字母顺序排列。
我创建了一个新的书籍元素,如:
<book>
<book-name>Zoos</book-name>
<book-color>Grey</book-color>
</book>
所以,我决定做的只是将新书附加到主要元素元素(这将它放在最后(即"<somemorerandomthings>"
元素下面)
然后我选择所有的&#34;书&#34;元素,对它们进行排序并循环遍历所有注释标记,并将它们添加到适当的位置。
$commentmarker_path = "//shelf/comment()";
foreach (range('B', 'Z') as $alphabet) {
$comment_id = str_repeat ($alphabet,20);
$commentmarker = $xpath->query($commentmarker_path."[contains(.,'$comment_id')]");
foreach( $sorted_books as $book_s )
{
$shelf_elm->item(0)->insertBefore($book_s, $commentmarker->item(0));
}
}
我的循环选择&#34; B&#34;标记并插入所有&#34; A&#34;这里的书。那么&#34; C&#34;标记并插入所有&#34; B&#34;在它之前的书。等...
问题在于以&#34; Z&#34;开头的书籍。我本来希望能够在上面的主循环中添加/排序所有书籍。目前我在外面有代码选择somemorerandomthings元素然后添加&#34; Z&#34;图书。如果有人移动该元素,这可能会造成问题。
旁注,我试过从&#34; A&#34; - &GT; &#34; Z&#34;并使用$commentmarker->item(0)->nextSibling
作为插入的标记点。但是因为我是&#34;插入&#34;进入原始的DOM元素,&#34; A&#34;标记下一个兄弟是Alphabets Book元素而不是&#34; B&#34;标记
对这个冗长的问题道歉,希望这是可以理解的。
感谢。