Я пытаюсь разобрать эту xml-информацию:
<text:p >Lorem<text:s/>ipsum.</text:p>
Поэтому я использую XMLReader. Почти все работает так, как мне нужно. Но <text: 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()))
Обновить:
Если я использую 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
}
}
}
Вы не хотите выводить <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.
Несколько замечаний о кодировке символов, которые я пропустил в своем примере:
Переход на латиницу-1 вы делаете (utf8_decode
) обычно не требуется, если вы выводите вывод в формате UTF-8. Увидеть Кодировки символов.
Если это необходимо для вашей целевой продукции, скорее всего, нет необходимости заботиться об этом в этом месте, см. ob_iconv_handler.
Других решений пока нет …