Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

XML que não consigo Manipular

Continuação do topico Anterior https://cursos.alura.com.br/forum/topico-xml-que-nao-consigo-manipular-21653

Obrigado ao Fernando, porém, chegamos a conclusão do Ultimo Código:

import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class teste {
    public static void main(String[] args) throws Exception {

        List<String> tags = Arrays.asList("connectionStrings", "add", "y", "z", "q");
        List<String> arquivos = Arrays.asList("src/web.config.xml");
        Map<String, String> attrs = new HashMap<>();

        attrs.put("connectionString", "NOVOVALOR");
        attrs.put("value", "novoValorValue");
       attrs.put("x", "não existe X");

        for (String arquivo : arquivos) {
            Document document = abreArquivo(arquivo);

            for (String tag : tags) {


                for (String attr : attrs.keySet()) {


                    int tagsAdd = document.getElementsByTagName(tag).getLength();

                    for (int i = 0; i < tagsAdd; i++) {
                        Element element = (Element) document.getElementsByTagName(tag).item(i);

                        if (element.hasAttribute(attr)) {

                            String attribute = element.getAttribute(attr);

                            System.out.println(attr + "=" + attribute);
                            System.out.println(attr + "=" + attrs.get(attr));

                        }
                    }
                }
            }
        }



    }

    private static Document abreArquivo(String arquivo) throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        return builder.parse(arquivo);
    }
}

Porém com um XML que tenha varias TAGS ADD, eu precisava Mapear assim: Alterar tudo que esteja dentro da Tag e todo ADD que estiver dentro dessa tag, os valores, e afins...

Como eu poderia fazer isso?

3 respostas

Fala aí Patrick,

Vamos lá continuar, kkk

Seus XML's tem sempre a mesma estrutura? se sim fica mais fácil de fazer as alterações se não preciso entender como são as estruturas que e em que ponto você quer alterar.

Indiferente de ter a mesma estrutura, mande uns exemplo do seu XML e marque onde você quer que seja feito a alteração.

Então Fernando, Eles não são todos iguais, senão seria mais fácil kkkkkk,

Mais as Estruturas resumidamente na maioria dos casos são assim:

<connectionStrings>
    <add connectionString="xxxxxx" name="aplicacao" providerName="System.Data.SqlClient"/>

Vou sempre buscar por essas tags, ou seja, alterar tudo que está dentro dessa tag pai e assim sucessivamente, vez ou outra, vou procurar outras tags, porém conseguindo fazer só dessa, já consigo ter uma ideia de como mapear para as outras, e claro, vou alterar os seus atributos dentro dela, em varios xml.

Não sei se ficou claro...

Obrigado Fernando!

solução!

Patrick pelo que eu entendi você pode ter a tag add em lugares diferentes dentro do seu xml.

E que na maioria dos seus casos você vai ter essa tag add dentro de uma tag connectionStrings.

Modifiquei meu ultimo exemplo, e agora ao invés de ter uma lista de tags coloquei um mapa de tags. (Todo o restante é o mesmo).

Dessa forma eu consigo associar tag pai e tag filha. Por exemplo: "Quero conseguir pegar todas as tags add que são filhas da tag connectionStrings."

Dessa forma eu consigo filtrar mais ainda meu resultado ao invés de pegar todas as tags add dentro do meu xml. No pior dos casos eu teria que associar uma tag raiz com minha tag add dessa forma ele pegaria todas as tags add dentro do meu xml.

Se você conseguir fazer essa associação de tags para o seu problema creio que resolva.

Segue exemplo:

<?xml version="1.0" encoding="utf-8" standalone="no"?><estrutura>

    <add key="novoValorKey" value="novoValorValue"/>

    <link>
        <add key="novoValorKey" value="novoValorValue"/>
    </link>

    <one>
        <two>
            <add key="novoValorKey" value="novoValorValue"/>
        </two>
    </one>

    <one>
        <two>
            <three>
                <add key="novoValorKey" value="novoValorValue"/>
            </three>
        </two>
    </one>

    <connectionStrings>
        <add connectionString="minhaConnectionString" name="aplicacao" providerName="System.Data.SqlClient"/>
    </connectionStrings>

</estrutura>

public static void main(String[] args) throws Exception {

        Map<String, String> tags = new HashMap<>();
        List<String> arquivos = Arrays.asList("src/vendas.xml");
        Map<String, String> attrs = new HashMap<>();


        tags.put("connectionStrings", "add");
        tags.put("link", "add");


        attrs.put("key", "MeuNovoValorKey");
        attrs.put("value", "MeuNovoValorValue");
        attrs.put("x", "não existe X");
        attrs.put("connectionString", "minhaConnectionString");

        for (String arquivo : arquivos) {
            Document document = abreArquivo(arquivo);

            for (String tag : tags.keySet()) {


                int totalTagOwner = document.getElementsByTagName(tag).getLength();

                for (int i = 0; i < totalTagOwner; i++) {
                    Element tagOwner = (Element) document.getElementsByTagName(tag).item(i);

                    int totalTagChildren = tagOwner.getElementsByTagName(tags.get(tag)).getLength();

                    for (int j = 0; j < totalTagChildren; j++) {

                        Element tagChildren = (Element) tagOwner.getElementsByTagName(tags.get(tag)).item(i);

                        for (String attr : attrs.keySet()) {

                            if (tagChildren.hasAttribute(attr)){
                                tagChildren.setAttribute(attr, attrs.get(attr));
                            }

                        }

                    }

                }
            }

            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer transformer = factory.newTransformer();

            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(new File(arquivo));

            transformer.transform(source, result);


        }



    }

    private static Document abreArquivo(String arquivo) throws ParserConfigurationException, SAXException, IOException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        return builder.parse(arquivo);
    }

Se achou útil marque como solução.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software