我尝试解析这个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
}
}
}
答案 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。