Imprimir página | Cerrar ventana

XML función damevalor1

Impreso de: Foro de Access y VBA
Categoría: Otros de Microsoft: Windows y Office
Nombre del foro: Excel
Descripción del foro: Foro de Excel y VBA de Excel
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86137
Fecha de impresión: 26/Marzo/2026 a las 18:58


Tema: XML función damevalor1
Publicado por: SkaryBlondi
Asunto: XML función damevalor1
Fecha de publicación: 05/Octubre/2021 a las 15:55
Buenas tardes

Por diversas cuestiones tengo que trabajar últimamente con muchos ficheros XML para lo cual las funciones sobre el tratamiento de los citados ficheros de Mihura me han ayudado mucho.

Me he encontrado un problema, que he resuelto y os traslado, por si te es de utilidad a otros miembros del foro.

Con la siguiente función

Function DameValor1(ByRef Nodo As MSXML2.IXMLDOMNode, Valor As String) As String
Dim xmlSingleNode As MSXML2.IXMLDOMNode

' esta funcion selecciona el primer nodo del NODO que se le pasa como argumento y que cumple el valor
' que se le pasa y devuelve el atributo texto del mismo, es decir el valor
' no se puede usar para los items que se repiten porque solo veríamos el primero e ignoraríamos el resto
    Set xmlSingleNode = Nodo.SelectSingleNode(Valor)
    If Not xmlSingleNode Is Nothing Then
        DameValor1 = xmlSingleNode.Text
    End If
    Set xmlSingleNode = Nothing
    Debug.Print DameValor1
End Function


Se recuperan los diversos datos de los nodos, pero en la ayuda de la función se indica lo siguiente "no se puede usar para los items que se repiten porque solo veríamos el primero e ignoraríamos el resto"

Me he encontrato con la necesidad de tratar ficheros XML de pago de cheques con carta donde las diversas líneas se indican con la etiqueta Ustrd y solo obtenía la primera línea del documento.

Después de darle unas cuantas vueltas se me ocurrió dejar en una variable el contenido de la etiqueta del nivel anterior RmtInf y bingo, me depositó concatenada en una sola variable el contenido de todas las etiquetas Ustrd contenidas y luego solo tuve que trocear la cadena para mis fines.

            <CdtTrfTxInf>
                <PmtId>
                    <InstrId>A11111118</InstrId>
                    <EndToEndId>A11111118</EndToEndId>
                </PmtId>
                <Amt>
                    <InstdAmt Ccy="EUR">000000001.00</InstdAmt>
                </Amt>
                <ChqInstr>
                    <ChqTp>BCHQ</ChqTp>
                    <DlvryMtd>
                        <Cd>PUDB</Cd>
                    </DlvryMtd>
                    <PrtLctn>111</PrtLctn>
                </ChqInstr>
                <Cdtr>
                    <Nm>NOMBRE PROVEEDOR</Nm>
                    <PstlAdr>
                        <Ctry>ES</Ctry>
                        <AdrLine>CL DEL OLVIDO 68-2-N</AdrLine>
                        <AdrLine>33013 OVIEDO</AdrLine>
                    </PstlAdr>
                </Cdtr>
                <RmtInf>
                    <Ustrd>una lnea del documento</Ustrd>
                    <Ustrd>otra linea del documento</Ustrd>
                    <Ustrd>otra linea del documento</Ustrd>
                    <Ustrd>otra linea del documento</Ustrd>
                    <Ustrd>otra linea del documento</Ustrd>
                    <Ustrd>otra linea del documento</Ustrd>
                    <Ustrd>otra linea del documento</Ustrd>
                    <Ustrd>otra linea del documento</Ustrd>
                </RmtInf>
            </CdtTrfTxInf>

Se lo comenté a Mihura, pero como suele ser habitual ÉL está ya de vuelta y me indicó que además del método propuesto se puede hacer de otro modo "Hay otra manera de tratar eso que dices, que es crear una variable Nodes, asignarle la colección de nodos que cumplen un criterio y después explotar dicha colección" y que es con otra función de sus ejemplos XML

Saludos,



Imprimir página | Cerrar ventana