edit-xml

Nesta seção, você encontra a referência de um Hook Declarativo do tipo edit-xml.

Um Hook Declarativo do tipo edit-xml define alterações feitas em arquivos XML existentes. Confira abaixo um exemplo de definição de um Hook Declarativo do tipo edit-xml:

hooks:
  - type: edit-xml
    trigger: after-render
    path: pom.xml
    encoding: UTF-8
    indent: "\t"
    changes:
      - xpath: .//dependency
        append:
          value: |
            <config>
              <vsync>1</vsync>
            </config>
        prepend:
          value: <{{input_tag}}>{{input_body}}</{{input_tag}}>

      - xpath: .//modelVersion
        text:
          value: 10.0.1

      - xpath: .//description
        text:
          snippet: snippets/description.txt

      - xpath: .//dependencies
        remove-attributes:
          - name: css

      - xpath: .//project.build.sourceEncoding
        attributes:
          - name: btn-name
            value: Build UTF-8

      - xpath: .//comments
        clear: true
      
      - xpath: ./dependencies/dependency/artifactId[.='spring-boot-starter-web']/..
        remove: true

Ações Disponíveis

path:

Define o caminho do arquivo que será editado. O caminho pode ser composto por expressões Jinja.

path: "./some/dir_xml/{{file_name}}"

trigger:

Campo para definir gatilhos que informam o momento em que a edição de arquivos deve ocorrer.

before-input:
Executa o Hook Declarativo antes de receber os parâmetros de entrada da pessoa usuária.

trigger: before-input

before-render:
Executa o Hook Declarativo antes do Template gerar arquivos no projeto.

trigger: before-render

after-render:
Executa o Hook Declarativo após o Template gerar arquivos no projeto.

trigger: after-render

enconding:

Define o tipo de encoding que será gravado no arquivo, e aceita os formatos comuns ao XML tal como [utf-8, ascii, windows-1252], caso não seja informado, será mantido o padrão original do arquivo. Seu uso é Opcional.

encoding: UTF-8

indent:

Define o(s) caracterer(s) para a indentação do documento gerado, o valor padrão é \t. Seu uso é Opcional.

indent: "\t"

changes:

É uma lista de ações de edição que são executadas na ordem em que aparecem. E o seu bloco tem como obrigatório o parâmetro xpath.

changes:
  - xpath: /people/person[last()]
    ...

xpath:

Permite inserir a linguagem de busca de XML. Seu uso é Obrigatório.

- xpath: //ns:project.build.sourceEncoding

É possível interpolar os valores do campo xpath com Jinja:

hooks:
  - type: edit-xml
    trigger: after-render
    path: pom.xml
    encoding: UTF-8
    indent: "\t"
    changes:
      - xpath: ".//{{INTERPOLAR-INPUT-AQUI}}"
        append:
          value: |
            <config>
              <vsync>1</vsync>
            </config>
        prepend:
          value: <{{input_tag}}>{{input_body}}</{{input_tag}}>

clear:(Opcional)

Remove todo o conteúdo do nó dado o contexto do xpath.

  - xpath: //ns:dependency
    clear: true

remove-attributes:(Opcional)

Remove os atributos de um nó. Os campos disponíveis são um ou mais name.

  - xpath: //ns:dependency
    remove-attributes:
      - name: css
      - name: style
      - name: data

append:(Opcional)

Adiciona nós XML dentro do contexto do resultado do xpath no fim da lista. Os campos disponíveis são value ou snippet.

value
Recebe o valor para ser adicionado ao XML.

append:
    value: |
      <config>
        <vsync>1</vsync>
      </config>

snippet
Recebe o snippet para ser adicionado ao XML.

append:
    snippet: snippets/fragment.xml

prepend:(Opcional)

Adiciona nós XML dentro do contexto do resultado do xpath no início da lista. Os campos disponíveis são value ou snippet.

value
Recebe o valor para ser adicionado ao XML.

append:
    value: <{{input_tag}}>{{input_body}}</{{input_tag}}>

snippet
Recebe o snippet para ser adicionado ao XML.

append:
    snippet: snippets/fragment.xml

next:(Opcional)

Adiciona nós XML no mesmo nível de contexto do resultado do xpath no fim da lista. Os campos disponíveis são value ou snippet.

value
Recebe o valor para ser adicionado ao XML.

append:
    value: |
       <dependency>
          <groupId>com.stackspot.lib</groupId>
          <artifactId>some-lib</artifactId>
          <version>1.0.0</version>
       </dependency>

snippet
Recebe o snippet para ser adicionado ao XML.

append:
    snippet: snippets/fragment.xml

previous:(Opcional)

Adiciona nós XML no mesmo nível de contexto do resultado do xpath no início da lista. Os campos disponíveis são value ou snippet.

value
Recebe o valor para ser adicionado ao XML.

append:
    value: |
       <dependency>
          <groupId>com.stackspot.lib</groupId>
          <artifactId>some-lib</artifactId>
          <version>1.0.0</version>
       </dependency>

snippet
Recebe o snippet para ser adicionado ao XML.

append:
    snippet: snippets/fragment.xml

text:(Opcional)

Adiciona texto dentro do contexto do resultado do xpath. Os campos disponíveis são value ou snippet.

value
Recebe o valor para ser adicionado ao XML.

append:
    value: version-10.0.1

snippet
Recebe o snippet para ser adicionado ao XML.

append:
    snippet: snippets/description.txt

attributes:(Opcional)

Adiciona atributos e valores a um nó. Os campos disponíveis são name e value.

name
Recebe o valor para ser adicionado ao XML.

value
Recebe o snippet para ser adicionado ao XML.

- xpath: //ns:button
  attributes:
    - name: btn-name
      value: Build UTF-8
    - name: style
      value: "color: #007"

remove:

Opção para remover um nó do arquivo XML. Use o valor true para remover o nó do arquivo XML.

hooks:
  - type: edit-xml
    trigger: after-render
    path: pom-remove.xml
    changes:
      - xpath: ./dependencies/dependency/artifactId[.='spring-boot-starter-web']/..
        remove: true

when:

Ação condicional que avalia se a inserção será efetivada. A opção disponível é not-exists, que recebe o texto ou arquivo para serem avaliados pela condição.

not-exists:
Checa se os valores informados nos campo value existem no arquivo. Caso exista, as ações clear, remove-attributes, append, prepend, next, previous, text e attributes não serão efetivadas.

hooks:
  - xpath: ./dependencies
    append:
      value: |
        <dependency>
            <groupId>com.stackspot</groupId>
            <artifactId>test</artifactId>
            <version>1.0.0</version>
        </dependency>
    when:
      not-exists: ./dependencies/dependency/groupId[.='com.stackspot']/../artifactId[.='test']

Leia também