【问题标题】:How to parse PCDATA and child element separately with PHP DOM?如何使用 PHP DOM 分别解析 PCDATA 和子元素?
【发布时间】:2017-10-26 13:11:54
【问题描述】:

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

在这些 p-tag 的 som 中有 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 完成(仅)。

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

【问题讨论】:

    标签: php xml dom parent-child pcdata


    【解决方案1】:

    DOMNode-&gt;nodeValue(在 PHP 的 DOMElement 中与 DOMNode-&gt;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>";
    }
    

    请注意,这仍然相当脆弱。例如:如果除&lt;noteref&gt; 元素之外的任何其他元素出现在&lt;p&gt; 元素中,它们也会被包裹在&lt;span&gt;&lt;b&gt; 元素中。

    希望我至少给了你一个线索,说明为什么你的结果 &lt;p&gt; 元素也显示了子元素的内容。


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

    【讨论】:

    • 谢谢你,它工作得很好!而且 p-tags 只包含 noterefs,所以这不会是一个问题。是的,我已经尝试过使用 XSLT,并且该部分与它完美配合。但是我在尝试使用 JavaScript 让书翻页等时遇到了一些其他问题,所以我选择使用 DOM。
    • @lindastralberg 对!很高兴听到它有帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多