【问题标题】:Append Child's Child Element附加孩子的孩子元素
【发布时间】:2013-11-04 16:03:33
【问题描述】:

有没有办法附加一个 SimpleXML 元素的子元素?

例如

<comments>
    <comment1>
        <commentcontent>Test</commentcontent>
    </comment1>
    <comment2>
        <commentcontent>Test2</commentcontent>
        <comment3>
            <commentcontent>Test3</commentcontent>
        </comment3>
    </comment2>
</comments>

我希望comment3 能够对其进行子集。我在想我可以使用一些正则表达式或通配符来忽略评论元素的数量,但还没有弄清楚如何。

我在尝试

$commentlevel = calculatelevel(($level[$commentkey] - 1)) . 'Comment' . $parent[$commentkey];
$newcomment = $commentsxml->xpath($commentlevel)->addChild('Comment' . $id);

function calculatelevel($level) {
    $compile = '';
    for($inc = 0; $inc < $level; $inc++) {
        $compile = 'Comment*/';
    }
    return $compile;
}

还有许多变体,但似乎都失败了。谢谢。

【问题讨论】:

  • 你到底为什么将元素称为comment1comment2 等? XML 的全部意义在于您可以将它们都称为comment
  • 此数字是唯一标识符,因此可以选择/定位每个元素。完整的 XML 会更有用吗?这是一个我认为更容易调试的简化版本。
  • 标签名称应该是元素的“类型”。如果你需要一个唯一的标识符,它应该是一个id
  • “标签名称”和“元素类型”是什么意思?我不认为这是回答问题的正确方向......
  • 标签名称为comment1 vs comment2 vs commentcontent vs p vs br vs blockquote等。如果将所有标签命名为comment,则可以有无限的嵌套,你的 XPath 会简单很多倍。

标签: php xpath simplexml


【解决方案1】:

如果可以的话,“规范化”你的 XML:

<comments>
    <comment id="1" content="Test">
        <comment id="2" content="Hello">
            <comment id="3" content="World">
                <comment id="4" content="It's me!" />
            </comment>
        </comment>
    </comment>
</comments>

Subcmets 就很容易了,因为您不必关心更改节点名称:

$comment = $xml->xpath("//comment[@id='4']")[0]; // get comment #4 , requires PHP >= 5.4
$newcomment = $comment->addChild('comment');
$newcomment->addAttribute('id', getNewId()); // function getNewId() not specified in this example 
$newcomment->addAttribute('content', 'I am new!'); 

看到它的工作:http://codepad.viper-7.com/K1cxAq

如果您的 PHP

list($comment,) = $xml->xpath("//comment[@id='4']");

如果不能更改XML但必须坚持使用,请澄清节点名称中数字的含义:它是唯一标识符,还是级别,节点的“深度” ?

【讨论】:

  • 好吧,让我们尝试一下基本用法,所以我们有:$xml = '&lt;cms&gt; &lt;cm id="1" cnt="Test"&gt; &lt;cm id="2" cnt="Hello"&gt; &lt;cm id="3" cnt="World"&gt; &lt;cm id="4" cnt="It\'s me!" /&gt; &lt;/cm&gt; &lt;/cm&gt; &lt;/cm&gt; &lt;/cms&gt;'; $simplexml = new SimpleXMLElement($xml); $cm = $simplexml-&gt;xpath("//cm[@id='4']")[0]; $newcm = $cm-&gt;addChild('cm'); $newcm-&gt;addAttribute('id', 5); $newcm-&gt;addAttribute('cnt', 'con'); 但我收到 Parse error: syntax error, unexpected '[' on line 14
  • 另外,在 cmets 中单独的旁注代码格式很糟糕,或者我做错了,浪费了 +300 个字符。
  • @user1419338:是的,而是编辑您的问题并在那里添加代码
  • 我将您的代码从该页面复制并粘贴到我的服务器,但仍然遇到相同的错误。我正在运行 php 版本 5.3.27。
  • 好的,我可以让它在我的服务器上运行。切换回我们的 5.4 服务器虽然我得到未定义的偏移量,从评论 = $xml->xpath("//comment[@id='4']")[0] 在 XML 文件的中途,它正在寻找的元素虽然存在。是否有关于 5.3 和 5.4 之间变化的文档?
猜你喜欢
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多