這是一個XML文件(ODT文件)的結構,這是我嘗試解析:循環通過與DOM文檔元素的所有孩子,並提取文本的內容
<office:body>
<office:text>
<text:h text:style-name="P1" text:outline-level="2">Chapter 1</text:h>
<text:p text:style-name="Standard">Lorem ipsum. </text:p>
<text:h text:style-name="Heading3" text:outline-level="3">Subtitle 2</text:h>
<text:p text:style-name="Standard"><text:span text:style-name="T5">10</text:span><text:span text:style-name="T6">:</text:span><text:s/>Text (100%)</text:p>
<text:p text:style-name="Explanation">Further informations.</text:p>
<text:p text:style-name="Standard">9.7:<text:s/>Text (97%)</text:p>
<text:p text:style-name="Explanation">Further informations.</text:p>
<text:p text:style-name="Standard"><text:span text:style-name="T9">9.1:</text:span><text:s/>Text (91%)</text:p>
<text:p text:style-name="Explanation">Further informations.</text:p>
<text:p text:style-name="Explanation">More furter informations.</text:p>
</office:text>
</office:body>
隨着XML閱讀器我做是這樣說的:
while ($reader->read()){
if ($reader->nodeType == XMLREADER::ELEMENT && $reader->name === 'text:h') {
if ($reader->getAttribute('text:outline-level')=="2") $html .= '<h2>'.$reader->expand()->textContent.'</h2>';
}
elseif ($reader->nodeType == XMLREADER::ELEMENT && $reader->name === 'text:p') {
if ($reader->getAttribute('text:style-name')=="Standard") {
$html .= '<p>'.$reader->readInnerXML().'<p>';
}
else if {
// Doing something different
}
}
}
echo $html;
現在我想這樣做同樣的事情與DOM文檔,但我需要一些幫助的語法。我如何循環辦公室的所有孩子:文字?當循環遍歷所有節點時,我會通過if/else來檢查要做什麼(文本:h與text:p)。
我還需要更換所有的文本:S(如果在文本這樣的元素:P)與空白...
$reader = new DOMDocument();
$reader->preserveWhiteSpace = false;
$reader->load('zip://content.odt#content.xml');
$body = $reader->getElementsByTagName('office:text')->item(0);
foreach($body->childNodes as $node) echo $node->nodeName . PHP_EOL;
還是會通過所有文本元素更加聰明,能循環?如果是這樣的話,仍然是問題,如何做到這一點。
$elements = $reader->getElementsByTagName('text');
foreach($elements as $node){
foreach($node->childNodes as $child) {
echo $child->nodeName.': ';
echo $child->nodeValue.'<br>';
// check for type...
}
}