如何检查上一个节点是否带有特定标签?

时间:2013-12-13 11:49:33

标签: php xml parsing dom domdocument

我有一个DomNode:

<p>
 This is a test <xref>1</xref> in the XML <xref>2</xref>,<xref>3</xref>,<xref>4</xref>  bla bla bla....
</p>

使用getElementsByTagName命令,我将从段落xref获取所有p

现在,我想知道在选定的xref之前是否还有另一个xref

为此,我考虑使用previousSibling,然后检查标记名称是否为xref,但这不起作用。

关于如何做到这一点的任何想法?

以下是我的尝试:

$refs = $paragraph->getElementsByTagName("xref");

foreach ($refs as $key=>$ref) {
   if ($ref->previousSibling->tagName == "xref") {
      //do something
   }
}

1 个答案:

答案 0 :(得分:2)

米洛斯,我已经为你的问题想出了一个解决方法。这不是一个漂亮的解决方案,但似乎确实可以完成这项工作。

由于浏览兄弟节点不起作用,我想到比较xref调用返回的每个getElementsByTagName节点的父节点,如下所示:

<?php
$xml = <<<XML
<body>
    <p>
        This is a test <a>0</a> <xref>1</xref> in the XML <xref>2</xref>,<xref>3</xref>,<xref>4</xref>  bla bla bla....
    </p>
    <p>
        <xref>5</xref>
    </p>
</body>
XML;

$dom = new DOMDocument;
$dom->loadXML($xml);
$xrefs = $dom->getElementsByTagName('xref');

foreach ($xrefs as $key => $xref) {
    if (!empty($parent)) {
        $previousParent = $parent;
    }

    $parent = $xref->parentNode;

    if ($key && ($parent === $previousParent)) {
        echo $xref->nodeValue, "\n";
    }
}

输出:

2
3
4

Working demo