2017-05-25 45 views
1

我试图解析一个dtbook的XML,其中包含以后包含p标签的级别(1,2和3)。我正在用PHP DOM做这件事。 Link to XML如何分别使用PHP DOM解析PCDATA和子元素?

这些p标签里面有索引标签。我确实掌握了这些内容,但似乎我能够得到的唯一结果是noteref出现在p-tag之前或之后。我需要一些noterefs出现在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标签获得的代码。在此之前,我正在循环阅读dt书以获取p标签。这工作正常。

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

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

我也想要th e p-tag到而不是显示noteref-tag中的内容。这应该由noteref-tag(仅)完成。

那么,有没有人知道可以做些什么来解决这些问题?这感觉就像我已经Google和Google尝试几乎所有东西。

回答

0

DOMNode->nodeValue(它在PHP的DOMElement中与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。请注意,学习曲线可能会很陡。

+1

谢谢,它工作完美!而p标签只包含noterefs,所以不会是一个问题。 是的,我已经尝试过使用XSLT,并且该部分与它完美配合。但是在尝试使用JavaScript来制作图书翻页等时我遇到了一些其他问题,所以我选择使用DOM来代替。 – lindastralberg

+0

@lindastralberg对!很高兴听到它的帮助。 –