Walking Tree: longitud de los valores de las etiquetas

Aquí está el problema que estoy tratando de resolver. Tengo una página HTML simple:

<html>
<head></head>
<body>
    <table>
        <tr>
            <td>Hello</td>
            <td>World</td>
        </tr>
        <tr>
            <td>Goodby</td>
            <td>World</td>
        </tr>
    </table>
</body>

Lo que quiero hacer es recorrer todo el árbol y almacenar la longitud de cada nodo de texto. No solo debe contener la longitud del nodo actual, sino que debe coincidir con la longitud de todos los nodos de texto anteriores. Permítanme aclarar lo que quiero decir con este ejemplo:

<html>
<head></head>
<body>
    <table>
        <tr>
            <td>Hello</td> // console output should be string of length: 5
            <td>World</td> // console output should be string of length: 10
        </tr>
        <tr>
            <td>Goodby</td> // console output should be string of length: 16
            <td>World</td> // console output should be string of length: 21
        </tr>
    </table>
</body>

Para eso implementé el siguiente código:

private static void print(Node aNode, int aCounter, String aIndent) 
{
    if(aNode.getNodeValue() != null)
        System.out.println(aIndent+aNode.getNodeName() + ", "+aNode.getNodeValue() + ", length: " + aCounter);
    else
        System.out.println(aIndent+aNode.getNodeName());

    Node child = aNode.getFirstChild();

    while (child != null) 
    {
        if(child.getNodeValue() != null)
        {
            aCounter += child.getNodeValue().length();
            print(child, aCounter, aIndent+" ");
        }
        else
            print(child, aCounter, aIndent+" ");

        child = child.getNextSibling();
    }
}

Paso el nodo raíz a este método. El problema de este código es que solo devuelve la longitud de un camino. Esto significa que obtengo algo como esto:

<html>
<head></head>
<body>
    <table>
        <tr>
            <td>Hello</td> // console output is string of length: 5
            <td>World</td> // console output is string of length: 10
        </tr>
        <tr>
            <td>Goodby</td> // console output should be string of length: 6 <-- does not consider overall length of previous <tr> content
            <td>World</td> // console output should be string of length: 11
        </tr>
    </table>
</body>

Básicamente, quiero la longitud de todos los caracteres desde el nodo raíz hasta el final de la etiqueta actual. Desafortunadamente no puedo encontrar la manera de hacer eso. Cualquier ayuda sería apreciada. Gracias de antemano.

preguntado el 12 de junio de 12 a las 16:06

1 Respuestas

aCounter se pasa por valor (no por referencia), por lo que agregarle un valor desde un método llamado recursivamente no afectará el valor en el método de llamada. Probablemente desee devolver el nuevo valor de aCounter al método de llamada para que pueda actualizar su propia versión.

Algo como esto debería funcionar:

private static void print(Node aNode, int aCounter, String aIndent) 
{
    if(aNode.getNodeValue() != null)
        System.out.println(aIndent+aNode.getNodeName() + ", "+aNode.getNodeValue() + ", length: " + aCounter);
    else
        System.out.println(aIndent+aNode.getNodeName());

    Node child = aNode.getFirstChild();

    while (child != null) 
    {
        if(child.getNodeValue() != null)
        {
            aCounter += child.getNodeValue().length();
        }
        aCounter = print(child, aCounter, aIndent+" ");

        child = child.getNextSibling();
    }

    return aCounter;
}

(Aunque probablemente querrá repensar los nombres de sus variables y métodos para hacerlo un poco más legible).

Respondido el 12 de junio de 12 a las 17:06

Gracias Mattias! Eso fue todo. También seguí su consejo y elegí métodos/nombres de variables más significativos. - user1451602

Si una respuesta resolvió tu problema, deberías aceptarlo. Simplemente haga clic en la marca de verificación a la izquierda de la respuesta. ;-)- Mattias Buelens

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.