Заменить & lt; text: s / & gt; с пробелами

Я пытаюсь разобрать эту 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
}
}
}

0

Решение

Вы не хотите выводить <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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]