1 (20.11.2014 17:59:23 отредактировано 1000Mhz)

Из xmlного файла надо удалить строку с неправильными данными (неправильным значением). Но после этого ломается структура документа и приложение его не обрабатывает, т. е. удалить строку можно только вместе со всем блоком:

...
<info>
    <value1>
        <value1 prop1="то самое (неверное) значение">
    </value1>
</info>
...

Проблема наверно уже типовая, должны же быть типовые решения? Если можно, с примером ab
У меня пока только идея заменить на "nil", но так некрасиво, лучше удалить совсем.

Leap 42.3 Calculate Linux, Xfce, Emacs, ..

2 (20.11.2014 23:04:25 отредактировано stranger)

1) Скрипт смотрит родительский тег и обнаруживает есть ли внутри него другие строки с тем же или иным тегом
2) Да есть - удаляется стока с открывающим и закрывающим тегом
3) Нет - удаляется весь родительский тег

То есть если

<info>
    <value1>
        <value1 prop1="то самое (неверное) значение">
    </value1>
</info>

Удаляется всё начиная с открывающего <info> включая закрывающий </info>

Если:

<info>
    <value1>
        <value1 prop1="то самое (неверное) значение">
    </value1>
    <sometag>
        <"что-то там другое">
    </sometag>
</info>
</info>

Удаляется от <value1> и включая </value1>

В общем случае. А вообще нужно видеть DTD

3

Спасибо, Кэп!  ab Если на шелл, то логичнее склеить все в одну строку и регуляркой выдернуть весь блок, но вопрос сколько займет обработка такой строки, которая может получится приличной длинны. Придется видимо разбираться со специальными инструментами для работы с xml..

Leap 42.3 Calculate Linux, Xfce, Emacs, ..

4 (21.11.2014 01:42:37 отредактировано stranger)

1000Mhz, я знаю про XML и алгоритмы. Про конкретные реализации скриптов shell - не ко мне, но ни разу не вижу необходимости каких-то гипотетических особых инструментов тут, задачи более чем стандартные. И да, DTD этого XML где?

5

Зато я не знаю. Дальше какие-то дебри начинаются, остановлюсь-ка на самом первом варианте))

Leap 42.3 Calculate Linux, Xfce, Emacs, ..

6

1000Mhz, дело Ваше (в конкретном скрипте bash), будут вопросы по XML - обращайтесь. И таки третий раз: где DTD???

7

1000Mhz пишет:

<value1 prop1="то самое (неверное) значение"/>

у тебя ошибка в документе: тег не закрыт

 Консоль:
$ cat 1.xml
<?xml version="1.0" encoding="UTF-8" ?>
<doc>
  <info>
    <value1>
      <value1 prop1="bad_value"/>
    </value1>
  </info>
  <info>
    <value1>
      <value1 prop1="bad_value"/>
      </value1>
    <value1>
      <value1 prop1="good_value"/>
    </value1>
  </info>
</doc>

$ xmlstarlet ed -d '//info/value1[value1[@prop1="bad_value"]]' -d '//info[not(*)]' 1.xml
<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <info>
    <value1>
      <value1 prop1="good_value"/>
    </value1>
  </info>
</doc>

ЗЫ: редактирование xml'я, как текст — это особый вид пытки...

95% процентов проблем находятся между клавиатурой и стулом.

8

1000Mhz пишет:

т. е. удалить строку можно только вместе со всем блоком:

что значит "со всем блоком? Какой уровень вложенности? <info> или только <value>?

В любом  случае, можно на  sed сделать, просто  закинуть блоки в область удержания, проанализировать, и  (не)выводить наружу.

пример  просили, да?

пример  текста

 Консоль:
$ cat t.txt
<info>
    <value1>
        <value1 prop1="bad">
    </value1>
</info>
<info>
    <value1>
        <value1 prop1="good">
    </value1>
</info>

пример кода

 Консоль:
$ sed -rn '/<value1>/!{p;b};:l;H;n;\~</value1>~!bl;x;/bad/{z;h;b};p;z;x;p' t.txt
<info>
</info>
<info>

    <value1>
        <value1 prop1="good">
    </value1>
</info>

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

9

Fat-Zer, огромное спасибо! Я на XPath застрял..
drBatty, вложенность от info включительно. Но вариант с sed выглядит немного жутковато, на мой дилетантский взгляд  ab

Leap 42.3 Calculate Linux, Xfce, Emacs, ..

10

1000Mhz пишет:

Но вариант с sed выглядит немного жутковато

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

11

Fat-Zer пишет:

тег не закрыт

Ну я думаю, в реальном документе такой лажи нет, ТС тут  дал так, для примера... Нет?

drBatty пишет:

Какой уровень вложенности?

Как я сказал выше, нужно смотреть остаётся ли тег пустым. Если да, то его нужно удалять. И да, мы оба давая примеры не исправили незакрытый одиночный тег, тут Fat-Zer прав.

1000Mhz,  DTD где?

12

stranger пишет:

DTD где?

Нету ab

drBatty пишет:

.. если  вы не осилили ..

Пока ниасилил. Но зачем в данном случае изобретать велосипеды, если xmlstarlet давно уже есть?

Leap 42.3 Calculate Linux, Xfce, Emacs, ..

13

stranger пишет:

Как я сказал выше, нужно смотреть остаётся ли тег пустым. Если да, то его нужно удалять.

можно  и  такую логику  сделать, но мне  лень.

stranger пишет:

И да, мы оба давая примеры не исправили незакрытый одиночный тег, тут Fat-Zer прав.

это не мы  должны  исправлять вход.

1000Mhz пишет:

Пока ниасилил. Но зачем в данном случае изобретать велосипеды, если xmlstarlet давно уже есть?

всё зависит  от  задачи.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

14

drBatty пишет:

можно  и  такую логику  сделать

Нужно. На том стоит логика XML.

drBatty пишет:

это не мы  должны

Тут согласен.