За последние 24 часа нас посетили 52597 программистов и 1764 робота. Сейчас ищут 786 программистов ...

Удаление пустых тегов из XML

Тема в разделе "Прочие вопросы по PHP", создана пользователем lexinfo, 26 янв 2011.

  1. lexinfo

    lexinfo Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    Допустим есть хмл:

    HTML:
    1.  
    2. <data>
    3.      <cont1></cont1>
    4.      <cont2>qwerty</cont2>
    5.      <cont3/>
    6.      <fields>
    7.           <fileld>
    8.                <row1></row1>
    9.                <row2/>
    10.                <row3>12345</row3>
    11.           </fileld>
    12.           <field>
    13.                <row1></row1>
    14.                <row2/>
    15.                <row3></row3>
    16.           </field>
    17.      </fields>
    18. </data>
    19.  
    нужно удалить все пустые теги в хмл, т.е. чтоб получилось

    HTML:
    1.  
    2. <data>
    3.      <cont2>qwerty</cont2>
    4.      <fields>
    5.           <fileld>
    6.                <row3>12345</row3>
    7.           </fileld>
    8.      </fields>
    9. </data>
    10.  
    Как это сделать? Помогите! Все форумы уже облазил....
     
  2. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    только рекурсивно обходя элементы
     
  3. Devzirom

    Devzirom Активный пользователь

    С нами с:
    15 фев 2009
    Сообщения:
    463
    Симпатии:
    0
    Адрес:
    Пермь
  4. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    что-то типа #<(\w+)(/>|</\1>)# может помочь
     
  5. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    MiksIr
    удалит только вложенные теги, но не внешние
     
  6. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    while (preg_replace) :)
     
  7. lexinfo

    lexinfo Активный пользователь

    С нами с:
    16 янв 2007
    Сообщения:
    51
    Симпатии:
    0
    Адрес:
    Ростов-на-Дону
    О! Удалило все <tag/> Как такое же сделать для <tag></tag>?? Заранее благодарен!

    И где можно про регулярки почитать? Что означает #, \w, =, |, \1 где это почитать доступно, для нубов?
     
  8. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Тут http://ru.php.net/manual/en/book.pcre.php

    # - это ограничители... могут быть любые, обычно это / ... /, но поскольку внутри регекспа есть / - нужно или эскейпить каждый внутри \/, или взять другой ограничитель. http://ru.php.net/manual/en/regexp.refe ... miters.php

    \w - специальная эскейп последовательность http://ru.php.net/manual/en/regexp.reference.escape.php
    + - модификатор повтора (в данном случае - один и более символ) http://ru.php.net/manual/en/regexp.refe ... tition.php
    | - альтернативный вариант http://ru.php.net/manual/en/regexp.refe ... nation.php
    \1 - ссылка на подшаблон http://ru.php.net/manual/en/regexp.refe ... rences.php

    По идее эта регулярка должна удалять и <tag></tag> но только если нет пробелов, с пробелами нужно как-то так
    #<(\w+)(/>|[\s\n\r\t]*</\1>)#
     
  9. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Регулярка здесь не подходит. Регулярные выражения не способны отслеживать вложенность тегов. Если бы не было вложенности все решалось бы элементарно просто:
    PHP:
    1. $str = preg_replace('/<\w+\/>/s', "", $str);
    2. $str = preg_replace('/<([^>]*)><\/\\1>/s', "", $str);
     
  10. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Как я уже говорил, цикл решит эту проблему. Обожаю повторять все по много раз.
     
  11. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Может xslt и xquery Вам в помощь?
     
  12. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Цикл в таких вещах жуткий костыль. Тут примерчик приведен детсадовский. Я посмотрю на ваш цикл в многомегабайтном файле с хотябы 10-кратной вложенностью тегов. Это во-первых.
    Во-вторых, тот цикл, что приведен, никуда не годиться: нету условия выхода из цикла.
     
  13. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    > Я посмотрю на ваш цикл в многомегабайтном файле с хотябы 10-кратной вложенностью тегов.
    Посмотрите. Не умничайте, а возьмите и посмотрите все способы с бенчмарками как по скорости, так и по потребляемой памяти.

    > Во-вторых, тот цикл, что приведен, никуда не годиться: нету условия выхода из цикла.
    А я кому-то обязан разжевывать и в рот класть?
     
  14. Jampire

    Jampire Активный пользователь

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Давно уже просмотрено и изучено.
    Хотя бы для себя сперва разжуйте. То, что цикл будет отрабатываться один лишний раз, это ж не проблема, бенчмарк это ж не заметит).
     
  15. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    мы же не разрабатываем высоконагруженно приложение, а даём советы.
    есть решение проще и лучше?