用空格</text:s>替换<text:s>

时间:2014-11-01 00:02:35

标签: php xml xmlreader

我尝试解析这个xml信息:

<text:p >Lorem<text:s/>ipsum.</text:p>

因此我使用XMLReader。几乎所有东西都在我需要的时候工作。但是&lt; text:s /&gt; -element给我带来了一些麻烦。 由于我想删除任何格式标签(即粗体),我使用expand()->textContent来获取文字:

$reader = new XMLReader();
if (!$reader->open("content.xml");
while ($reader->read()) {
    if ($reader->nodeType == XMLREADER::ELEMENT && $reader->name === 'text:p') echo utf8_decode($reader->expand()->textContent);
}

在这种情况下,我会得到Loremipsum。&#39;而不是Lorem ipsum。&#39;。如何替换每个&lt; text:s /&gt;有空白。

更新 我是这样做的:preg_replace("/<\\/?text:s(\\s+.*?>|>)/", " ", utf8_decode($reader->readInnerXML()))

更新

如果我使用DOMDocument进行解析,我该如何更改语法?

$reader = new DOMDocument();
$reader->load("zip://folder/".$file.".odt#content.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") {
            $str = $reader->readInnerXML(); 
            // replace text:s-elements with " " at this point
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您不想输出<text:p>元素,但是您只想输出文本节点和<text:s>元素作为空格:

 $reader = new XMLReader();
 $result = $reader->open("content.xml");
 if (!$result) {
     throw new UnexpectedValueException('Could not open XML file for reading.');
 }

while ($reader->read()) {
    if ($reader->nodeType == XMLREADER::ELEMENT && $reader->name === 'text:s') {
        echo " "; // SPACE
    }
    if ($reader->nodeType == XMLREADER::TEXT) {
        echo $reader->textContent;
    }
}

因此处理逻辑问题更严重, XMLReader 的技术问题更少。

关于我在我的例子中遗漏的字符编码的一些注释:

如果将输出作为UTF-8传送,通常不需要转换为Latin-1(utf8_decode)。请参阅Character encodings

如果您的目标输出是必要的,那么很可能没有必要在那个地方处理它,请参阅ob_iconv_handler