XML удаляет закрывающие / открывающие теги

У меня проблема с фрагментом XML, который я хочу проанализировать с помощью PHP.
Вот пример, который я имею:

<tags>
<content>content</content>
<amplifications>
<tag>content 1</tag>
</amplifications>
<amplifications>
<tag>content 2</tag>
<tag>content 3</tag>
<tag>content 4</tag>
<tag>content 5</tag>
</amplifications>
</tags>

Где я хочу убрать

</amplifications>
<amplifications>

Я пытался использовать preg_replace, но кажется, что я не могу понять это, потому что эти теги имеют отступы по-разному и есть пробелы.

0

Решение

Это должно помочь вам.

str_replace("</", "<", $XMLData);
0

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

Первая проблема, с которой вы можете столкнуться — preg_replace не совпадает между разными строками по умолчанию.

Вы можете добавить модификатор (http://php.net/manual/en/reference.pcre.pattern.modifiers.php) чтобы изменить это.

м (PCRE_MULTILINE)

По умолчанию PCRE рассматривает строку темы как состоящую из одной «строки» символов (даже если она на самом деле содержит несколько новых строк). Метасимвол «начало строки» (^) совпадает только в начале строки, а метасимвол «конец строки» ($) — только в конце строки или перед завершающим символом новой строки (если не установлен модификатор D ). Это так же, как Perl. Когда этот модификатор установлен, конструкции «начало строки» и «конец строки» совпадают сразу после или непосредственно перед любой новой строкой в ​​строке темы соответственно, а также в самом начале и конце. Это эквивалентно модификатору Perl’s / m. Если в строке темы нет символов «\ n» или в шаблоне нет вхождений ^ или $, установка этого модификатора не имеет никакого эффекта.

После этого вы должны быть осторожны при написании регулярного выражения. Такие вещи могут произойти:

<amplifications>
<amplifications>
</amplifications>
</amplifications>

И ты не хочешь соответствовать первому <amplifications> с первым </amplifications>, Если этот случай не может произойти, ваше регулярное выражение будет легче написать.

Я могу добавить детали, если вы хотите, но это уже должно вам немного помочь.

0

Объедините все дочерние элементы всех элементов с определенным именем тега в первый элемент:

Пример XML:

<tags>
<content>content</content>
<amplifications>
<tag>content 1</tag>
</amplifications>
<amplifications>
<tag>content 2</tag>
<tag>content 3</tag>
<tag>content 4</tag>
<tag>content 5</tag>
</amplifications>
</tags>

РНР-Пример:

$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->preserveWhiteSpace = false;
$doc->loadXML($xml);

$name     = 'amplifications';
$elements = $doc->getElementsByTagName($name);

foreach ($elements as $parent) {
if ($elements->item(0) === $parent) {
continue;
}
foreach (iterator_to_array($parent->childNodes) as $child) {
$elements->item(0)->appendChild($child);
}
$parent->parentNode->removeChild($parent);
}

echo $doc->saveXML();

Выход:

<?xml version="1.0"?>
<tags>
<content>content</content>
<amplifications>
<tag>content 1</tag>
<tag>content 2</tag>
<tag>content 3</tag>
<tag>content 4</tag>
<tag>content 5</tag>
</amplifications>
</tags>
0
По вопросам рекламы [email protected]