1

我正在尝试解析 dtbook 的 XML,其中包含稍后包含 p-tag 的级别(1、2 和 3)。我正在用 PHP DOM 做这个。链接到 XML

在这些 p-tags 中,有一些 noteref-tags。我确实掌握了这些,但似乎我能得到的唯一结果是 noteref 出现在 p-tag 之前或之后。我需要一些注释出现在 p-tag 中;或者换句话说,它们实际上应该在哪里。

<p>Special education for the ..... <noteref class="endnote" idref="fn_5"
id="note5">5</noteref>. Interest ..... 19th century <noteref class="endnote"
idref="fn_6" id="note6">6</noteref>.</p>

这是我现在为 p-tag 获得的代码。在此之前,我正在遍历 dt-book 以获取 p-tag。这很好用。

if($level1->tagName == "p") {
    echo "<p>".$level1->nodeValue;
    $noterefs = $level1->childNodes;
    foreach($noterefs as $noteref) {
        if($noteref->nodeType == XML_ELEMENT_NODE) {
            echo "<span><b>".$noteref->nodeValue."</b></span>";
        }
    }  
    echo "</p><br>";
}

这些是我得到的结果:

特殊教育...... 5. 兴趣...... 19 世纪 6. 56

56特殊教育...... 5. 兴趣...... 19 世纪 6.

我还希望 p-tag显示 noteref-tag 中的内容。这应该由 noteref-tag 完成(仅)。

那么,有人知道可以做些什么来解决这些问题吗?感觉就像我已经用谷歌搜索并尝试了几乎所有东西。

4

1 回答 1

0

DOMNode->nodeValue(在 PHPDOMElement中与 相同DOMNode->textContent)将包含来自自身及其所有降序节点的完整文本内容。或者,更简单一点:它包含节点的完整内容,但删除了所有标签。

您可能想要尝试的是以下内容(未经测试):

if($level1->tagName == "p") {
    echo "<p>";
    // loop through all childNodes, not just noteref elements
    foreach($level1->childNodes as $childNode) {
      // you could also use if() statements here, of course
      switch($childNode->nodeType) {
        // if it's just text
        case XML_TEXT_NODE:
          echo $childNode->nodeValue;
        break;
        // if it's an element
        case XML_ELEMENT_NODE:
          echo "<span><b>".$childNode->nodeValue."</b></span>";
        break;
      }
    }  
    echo "</p><br>";
}

请注意,这仍然相当脆弱。例如:如果任何其他元素,除了<noteref>元素,出现在<p>元素中,它们也将被包裹在<span><b>元素中。

希望我至少为您提供了一个线索,说明为什么您的结果<p>元素也显示了子元素的内容。


附带说明:如果您想要实现的是将 XML 文档的内容转换为 HTML 或其他一些 XML 结构,那么研究XSLT可能会有所收获。请注意,学习曲线可能很陡峭。

于 2017-05-25T22:02:32.107 回答