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

0

У меня проблема с фрагментом 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, но кажется, что я не могу понять это, потому что те теги имеют отступы по-разному и есть пробелы.

Теги:
xmlwriter

3 ответа

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

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

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

м (PCRE_MULTILINE)

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

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

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

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

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

0

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

str_replace("</", "<", $XMLData);
  • 0
    Что ж, я хочу полностью удалить закрывающие / открывающие усиления, поэтому все <tag> </ tag> находятся внутри одного <усиления> </ усиление>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню