代码之家  ›  专栏  ›  技术社区  ›  Wais Kamal

不会添加XML子元素,但不会在PHP中引发任何错误

  •  2
  • Wais Kamal  · 技术社区  · 6 年前

    从我的 previous question

    addChild() <comment> 元素作为根元素的子元素。我使用了 this 问题:

    $file = "comments.xml";
    
    $comment = $xml -> comment;
    
    $comment -> addChild("user","User2245");
    $comment -> addChild("date","02.10.2018");
    $comment -> addChild("text","The comment text goes here");
    
    $xml -> asXML($file)
    

    现在,当我回显文件内容时:

    foreach($xml -> children() as $comments) { 
      echo $comments -> user . ", "; 
      echo $comments -> date . ", "; 
      echo $comments -> text . "<br>";
    }
    

    我只获取旧文件内容(没有更改):

    User4251,02.10.2018,Comment body goes here
    User8650,02.10.2018,Comment body goes here
    

    我在用同样的 注释.xml 文件。没有显示错误。

    为什么子元素不被追加?

    2 回复  |  直到 6 年前
        1
  •  1
  •   user3783243    6 年前

    您正在添加到 comment 元素,将其添加到完整文档中。

    $xml = new simplexmlelement('<?xml version="1.0" encoding="utf-8"?>
    <comments><comment>
      <user>User4251</user>
      <date>02.10.2018</date>
      <text>Comment body goes here</text>
    </comment>
    <comment>
      <user>User8650</user>
      <date>01.10.2018</date>
      <text>Comment body goes here</text>
    </comment></comments>');
    $child = $xml->addchild('comment');
    $child->addChild("user","User2245");
    $child->addChild("date","02.10.2018");
    $child->addChild("text","The comment text goes here");
    echo $xml->asXML();
    

    https://3v4l.org/Pln6U

        2
  •  1
  •   IMSoP    6 年前

    如果输出完整的XML,则 echo $xml->asXML() 到第一个注释节点:

    <comment>
        <user>User4251</user>
        <date>02.10.2018</date> 
        <text>Comment body goes here</text> 
        <user>User2245</user><date>02.10.2018</date><text>The comment text goes here</text>
    </comment>
    

    原因只有第一个 comment 和你的 echo 不显示新值:如果引用 $xml->comment $comment->user 第一 具有该名称的子元素;只是简写一下 $xml->comment[0] $comment->user[0] $xml->comment->user $xml->comment[0]->user[0] $xml->comment->user[0]

    自从你打电话来 addChild ,新的 user date ,和 text 不是第一个用这个名字的孩子,所以他们不会出现在你的输出中。

    新的评论

    $comment = $xml->addChild('comment');
    $comment->addChild('user', 'User2245');
    

    如果你想要的是

    $comment = $xml->comment[0]; // or just $comment = $xml->comment;
    $comment->user = 'User2245';
    

    或者你可以在上面加些东西 每个 现有的注释(注意这里我们使用 好像是一个阵列;同样,无论有一个或多个匹配元素,SimpleXML都允许我们这样做:

    foreach ( $xml->comment as $comment ) {
        $comment->addChild('modified', 'true');
    }