Parsare fisier xml folosind Stream API din java

Salut !

In C# pot parsa un xml folosinf LINQ
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/linq-to-xml-overview

IEnumerable<string> partNos = purchaseOrder
 .Descendants("Item").Select(x => (string) x.Attribute("PartNumber"));

Sunt curios daca se poate face ceva asemanator folosind stream-urile si programarea functionala din java.

Cam ceva de genul acesta

int sum = widgets.stream()
                      .filter(w -> w.getColor() == RED)
                      .mapToInt(w -> w.getWeight())
                      .sum();

Convertesti XML-ul intr-o lista cu xmlMapper.readValue() si dupa o folosesti cu lista.stream().map( el-> el.name).filter(name -> name == ‘Janos’) daca XML-ul se mapeaza key-value.

Probabil ca exista librarii care fac exact ce face linq, eu personal urasc XML-ul pe backend. XML-ul e oribil pentru programare functionala fiindca n-ai o structura de date fixa. De multe ori n-ai obiecte simple de la deserializare, ai un tree de noduri in tree de noduri in tree de noduri si valorile nu sunt key value ci ai mai multe attribute. (JS developer here)

Deci parsarea de XML se face cu query-uri, daca ai un XML parser (XPath) poti sa faci un query similar cu linq si lucrezi direct cu nodurile de XML cu functii speciale ale parser-ului.

Daca vrei neaparat ceva functional deserializezi XML-ul, il parsezi functional, dupa reconstruiesti nodurile XML din array/lista. Alternativa e sa iti scrii propriul filter, map, reduce pentru noduri.

Am gasit ca pot folosi Jaxb din java si stream api

    private static Employee readXml(Employee employee) throws JAXBException {
        var jaxbContext = JAXBContext.newInstance(Employee.class);
        var unmarsheller = jaxbContext.createUnmarshaller();

        return (Employee)unmarsheller.unmarshal(new File(XML_FILE));
    }

var stream = Stream.of(readXml(emp));

        stream.filter(e -> e.getName().equals("Charile"))
                .forEach(e -> System.out.println(e.getRole()));

Mai cercetez. Interesant si jackson

M-am jucat putin cu JAXB si a rezultat ce este pe aici

Pe masura de descopar ceva noi, voi face push :slightly_smiling_face:

1 Like