1

Я пытаюсь сделать сценарий оболочки с 2 параметрами.

xmlcomment -c cholo

или же

xmlcomment -u cholo

Учитывая следующий XML-файл,

<?xml version="1.0"?>
<guyList>
<guy>
    <name>paco</name>
    <fullname>Paco Tilla</fullname>
    <theme>paco</theme>
  </guy>
  <guy>
    <name>cholo</name>
    <fullname>Cholo Cote</fullname>
    <theme>cholocote</theme>
  </guy>
  <guy>
    <name>temo</name>
    <fullname>Temo Lesto</fullname>
    <theme>temol</theme>
  </guy>
</guyList>

Первый комментарий комментирует блок «<guy>», который содержит «<name> paco </name>», что приводит к следующему изменению файла.

<?xml version="1.0"?>
<guyList>
<guy>
    <name>paco</name>
    <fullname>Paco Tilla</fullname>
    <theme>paco</theme>
  </guy>
<!--
  <guy>
    <name>cholo</name>
    <fullname>Cholo Cote</fullname>
    <theme>cholocote</theme>
  </guy>
-->
  <guy>
    <name>temo</name>
    <fullname>Temo Lesto</fullname>
    <theme>temol</theme>
  </guy>
</guyList>

Второй пример просто раскомментирует тот же блок (если он прокомментирован), который представлен в первом XML.

Любая идея о хорошем подходе к этому? сед? какой-то другой редактор XML?

Спасибо

2 ответа2

0

Может быть сделано с помощью sed (возможно, не лучший подход). Сценарии одинаковы, просто заменяют линейные адреса и что заменяют в каждом случае.

sed '/<guy>/ {
    :a
    N
    /<\/guy>/ {
            /cholo/ {
                    s/^/<!--\n/
                    s/$/\n-->/
            }
    p
    d
    }
    ba
}' file-without-comment
<?xml version="1.0"?>
<guyList>
<guy>
    <name>paco</name>
    <fullname>Paco Tilla</fullname>
    <theme>paco</theme>
  </guy>
<!--
  <guy>
    <name>cholo</name>
    <fullname>Cholo Cote</fullname>
    <theme>cholocote</theme>
  </guy>
-->
  <guy>
    <name>temo</name>
    <fullname>Temo Lesto</fullname>
    <theme>temol</theme>
  </guy>
</guyList>

sed '/<!--/ {
    :a
    N
    /-->/ {
            /cholo/ {
                    s/<!--\n//
                    s/\n-->//
            }
    p
    d
    }
    ba
}' file-with-comment                                          
<?xml version="1.0"?>
<guyList>
<guy>
    <name>paco</name>
    <fullname>Paco Tilla</fullname>
    <theme>paco</theme>
  </guy>
  <guy>
    <name>cholo</name>
    <fullname>Cholo Cote</fullname>
    <theme>cholocote</theme>
  </guy>
  <guy>
    <name>temo</name>
    <fullname>Temo Lesto</fullname>
    <theme>temol</theme>
  </guy>
</guyList>
0

Вы можете использовать процессор XSLT для этого, например, xsltproc:

<xsl:template match="guy[name='cholo']">
  <xsl:comment>
    <xsl:apply-templates select="@*|node()" />
  </xsl:comment>
</xsl:template>

Этот подход не полностью воспроизводит исходную структуру XML, но он комментирует соответствующий раздел о guy .

Выход:

<guyList>
    <guy>
        <name>paco</name>
        <fullname>Paco Tilla</fullname>
        <theme>paco</theme>
    </guy>
    <!--
      cholo
      Cholo Cote
      cholocote
    -->
    <guy>
        <name>temo</name>
        <fullname>Temo Lesto</fullname>
        <theme>temol</theme>
    </guy>
</guyList>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .