es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Buscando a través de múltiples archivos XML para encontrar un valor específico

Estoy tratando de encontrar una solución en la que pueda buscar a través de 1189 archivos XML para encontrar un valor específico que el usuario proporciona.

Como ejemplo, el usuario está buscando un código postal, 8913CK, que se puede encontrar en cualquiera de los 1189 archivos XML. ¿Cuál sería la mejor manera de abordar esto? He intentado hacer un bucle a través de los archivos, lo que resulta en respuestas lentas e ineficientes, y he intentado configurar canales y trabajadores que hicieron que los resultados fueran mucho más rápidos, pero aún no deseables y a veces no se mostraron resultados (esto podría ser porque no estoy tan familiarizado con GoLang).

La estructura del archivo XML es la siguiente:

Tags:  

Answer

  1. Avatar for davy.ai

    Una forma de abordar este problema es utilizar una combinación de los paquetes de la biblioteca estándar de Go “filepath” y “encoding/xml”.

    1. Primero, puedes utilizar filepath.Walk para recorrer todos los archivos XML en un directorio dado. Para cada archivo, puedes abrir y leer su contenido.
    2. Luego, puedes analizar el contenido XML utilizando encoding/xml para crear una estructura NumPostal.

    3. Después, puedes verificar si la estructura NumPostal analizada contiene el código postal específico que el usuario está buscando.

    4. Si se encuentra el código postal, puedes mostrar el nombre del archivo y cualquier otra información relevante.

    Aquí tienes un código de ejemplo para comenzar:

    package main
    
    import (
        "encoding/xml"
        "fmt"
        "os"
        "path/filepath"
    )
    
    type NumPostal struct {
        BagObject struct {
            Nummeraanduiding struct {
                Identificatie struct {
                    Text   string `xml:",chardata"`
                    Domein string `xml:"domein,attr"`
                } `xml:"identificatie"`
                Huisnummer struct {
                    Text string `xml:",chardata"`
                } `xml:"huisnummer"`
                Huisletter struct {
                    Text string `xml:",chardata"`
                } `xml:"huisletter"`
                Postcode struct {
                    Text string `xml:",chardata"`
                } `xml:"postcode"`
                LigtAan struct {
                    OpenbareRuimteRef struct {
                        Text string `xml:",chardata"`
                    } `xml:"OpenbareRuimteRef"`
                } `xml:"ligtAan"`
                Huisnummertoevoeging struct {
                    Text string `xml:",chardata"`
                } `xml:"huisnummertoevoeging"`
            } `xml:"Nummeraanduiding"`
        } `xml:"bagObject"`
    }
    
    func main() {
        // reemplaza esto con el directorio que contiene los archivos XML
        directorio := "/ruta/hacia/los/archivos/xml"
    
        // reemplaza esto con el código postal que el usuario está buscando
        codigoPostalBuscado := "8913CK"
    
        err := filepath.Walk(directorio, func(path string, info os.FileInfo, err error) error {
            if err != nil {
                return err
            }
            if !info.IsDir() && filepath.Ext(path) == ".xml" {
                // abre el archivo para leer
                archivo, err := os.Open(path)
                if err != nil {
                    return err
                }
                defer archivo.Close()
    
                // analiza el archivo XML en una estructura NumPostal
                var numPostal NumPostal
                err = xml.NewDecoder(archivo).Decode(&numPostal)
                if err != nil {
                    return err
                }
    
                // verifica si se encuentra el código postal
                if numPostal.BagObject.Nummeraanduiding.Postcode.Text == codigoPostalBuscado {
                    // muestra el nombre del archivo y cualquier otra información relevante
                    fmt.Printf("Se encontró el código postal %s en el archivo %s\n", codigoPostalBuscado, path)
                }
            }
            return nil
        })
        if err != nil {
            fmt.Println(err)
        }
    }
    

    Nota: Este código asume que todos los archivos XML en el directorio tienen la misma estructura que la muestra proporcionada. Si hay variaciones, es posible que debas modificar el código para manejarlas. Además, este código puede no ser la solución más eficiente para directorios o archivos XML muy grandes.

Comments are closed.