代码之家  ›  专栏  ›  技术社区  ›  miCRoSCoPiC_eaRthLinG

添加XML块作为SimpleXMLElement对象的子对象

  •  4
  • miCRoSCoPiC_eaRthLinG  · 技术社区  · 16 年前

    $xml = <<<EOX
    <books>
        <book>
            <name>ABCD</name>
        </book>
    </books>
    EOX;
    
    $sx = new SimpleXMLElement( $xml );
    

    现在我有一个名为Book的类,它包含信息。关于每本书。同一个类也可以吐出图书信息。以类似于上述(嵌套块)的XML格式。。例子,

    $book = new Book( 'EFGH' );
    $book->genXML();
    
    ... will generate
    <book>
        <name>EFGH</name>
    </book>
    

    现在,我正试图找出一种方法,通过这种方法,我可以使用生成的XML块并将其作为的子项进行追加,因此现在看起来像。。。例如

    // Non-existent member method. For illustration purposes only.
    $sx->addXMLChild( $book->genXML() );    
    
    ...XML tree now looks like:
    <books>
        <book>
            <name>ABCD</name>
        </book>
        <book>
            <name>EFGH</name>
        </book>
    </books>
    

    addChild() 无法完成此操作,因为它不支持XML数据作为标记值。

    2 回复  |  直到 12 年前
        1
  •  4
  •   hakre    12 年前

    两种解决方案。首先,在libxml/DOMDocument/SimpleXML的帮助下完成这项工作:您必须导入 $sx 反对 DOM ,创建一个 DOMDocumentFragment 和使用 DOMDocumentFragment::appendXML() :

    $doc = dom_import_simplexml($sx)->ownerDocument;
    
    $fragment = $doc->createDocumentFragment();     
    $fragment->appendXML($book->genXML());
    $doc->documentElement->appendChild($fragment);
    
    // your original $sx is now already modified.
    

    Online Demo

    您还可以从 单纯形元素

    $sx = new MySimpleXMLElement($xml);
    
    $sx->addXML($book->genXML());
    

    简单化 . 你抓住 SimpleDOM 您使用insertXML(),它的工作原理与您描述的addXMLChild()方法类似。

    include 'SimpleDOM.php';
    
    $books = simpledom_load_string(
        '<books>
            <book>
                <name>ABCD</name>
            </book>
        </books>'
    );
    
    $books->insertXML(
        '<book>
            <name>EFGH</name>
        </book>'
    );
    
        2
  •  4
  •   hakre    12 年前

    看看我的代码:

    $doc = new DOMDocument();       
    $doc->loadXML("<root/>");       
    
    $fragment = $doc->createDocumentFragment();     
    $fragment->appendXML("<foo>text</foo><bar>text2</bar>");
    $doc->documentElement->appendChild($fragment);
    
    echo $doc->saveXML();
    

    Online Demo

    推荐文章