2014-11-01 66 views
0

更换 我尝试解析该XML的信息:与空白

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

所以我使用的XMLReader。几乎所有事情都在按需要工作。但是<文本:s /> - 元素给我带来了一些麻烦。 当我想删除格式化标签(即粗体)我使用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。”而不是'Lorem ipsum。'。我如何用空格替换每个<文本:s/>。

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

更新:

如果我使用DOM文档进行解析,怎么办我必须要改变的语法?

$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

尝试'$ string = str_replace(“”,“”,$ string);'或'$ string = str_replace(“”,“\ n”,$ string);' – 2014-11-01 00:17:56

+0

'expand() - > textContent'导致一个没有其他标签的字符串。所以文本:s-tag已经在if子句中被删除了。这是我的问题... – user3142695 2014-11-01 00:25:17

+0

然后尝试'echo utf8_decode($ reader-> expand() - > textContent)。 “”;'或'echo utf8_decode($ reader-> expand() - > textContent)。 “\ n”;' - 或放置'。 “”在结束括号内。 – 2014-11-01 00:29:24

回答

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

上的字符编码,我在我的例子忽略了一些注意事项:

转换到Latin-1的你(utf8_decode)通常不应该,如果你提供的输出为UTF-8是必要的。见Character encodings

如果需要您的目标输出,最有可能不需要在那个地方照顾它,请参阅ob_iconv_handler

+0

谢谢你的有趣答案。在文件中,有文本:h和text:p元素,我必须区别对待。在这个问题中,我描述了文本的部分:p-节点。所以我认为我不能只使用XMLREADER :: TEXT。是的,我有一些编码问题:ODT文件具有德文变音符号,电子短划线,土耳其字符或ie等字符。 'μ'。我试图使用utf8_decode,但我有时会'?'。这有点奇怪,因为有些字符转换正确。 – user3142695 2014-11-01 23:23:42

+0

坚持utf-8,不要解码。而不是** XMLReader **使用** DOMDocument **解析文件。 – hakre 2014-11-02 00:29:43

+0

我已更新帖子。想尝试DOMDocument,但是我在语法上遇到了一些问题......如果可以提供帮助,会很棒。 – user3142695 2014-11-02 00:57:03