注释后附加PHP DOMNode

时间:2016-12-27 11:17:45

标签: php sorting dom domdocument

美好的一天,

我需要帮助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;标记

对这个冗长的问题道歉,希望这是可以理解的。

感谢。

0 个答案:

没有答案