循环遍历所有节点并使用Java更新值

时间:2012-04-16 10:31:06

标签: java xml regex xml-parsing

我在尝试遍历XML字符串中的所有节点然后更新值时遇到了一些问题。请注意,我对Java仍然相当新。

我的目标是遍历每个元素和属性,然后对每个值运行一个RegEx,以确保字段只包含一组预定义的字符。如果该字段包含不需要的字符,则会删除这些字符并更新字段。

我可能这样做完全错了,但在尝试编辑孩子的孩子时会出现问题,请参阅下面的代码。

protected NodeList checkXML(Node node, String strStripCharsRegEx) {
    String strNodeResult = "";
    //NodeList nodeResult = null;

    // do something with the current node instead of System.out
    System.out.println(node.getNodeName());

    strNodeResult = "";
    if(node.getNodeValue() != null && node.getNodeValue() != "")
    {
        for(char c : node.getNodeValue().toCharArray()) {
            if(Character.toString(c).matches(strStripCharsRegEx))
                strNodeResult = strNodeResult + c;
            }

        if(strNodeResult != "")
        {
            node.setNodeValue(strNodeResult);
        }   
    }

    if(node.hasAttributes())
    {
        NamedNodeMap XMLAttributes = node.getAttributes();
        if(XMLAttributes != null)
        {
            for(int attribIndex=0; attribIndex< XMLAttributes.getLength(); attribIndex++)
            {
                System.out.println("AttribName = " + XMLAttributes.item(attribIndex).getNodeName());
                if(XMLAttributes.item(attribIndex).getNodeValue() != null)
                {
                    if(XMLAttributes.item(attribIndex).getNodeValue() != null && XMLAttributes.item(attribIndex).getNodeValue() != "")
                    {
                        strNodeResult = "";
                        for(char c : XMLAttributes.item(attribIndex).getNodeValue().toCharArray()) 
                        {
                            if(Character.toString(c).matches(strStripCharsRegEx))
                                strNodeResult = strNodeResult + c;
                        }

                        if(strNodeResult != "")
                        {
                            XMLAttributes.item(attribIndex).setNodeValue(strNodeResult);
                        }
                    }

                    System.out.println("AttribValue = " + XMLAttributes.item(attribIndex).getNodeValue());  
                }
            }
        }
    }           

    //Check for Children
    NodeList nodeList = node.getChildNodes();

    if(nodeList != null && node.hasChildNodes())
    {           
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node currentNode = nodeList.item(i);
            if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
                if(currentNode.hasChildNodes())
                {
                    //calls this method for all the children which is Element
                    checkXML(currentNode, strStripCharsRegEx);                  
                }               
            }
        }
    }

    return nodeList;
}

任何帮助都将不胜感激。

谢谢

安迪

2 个答案:

答案 0 :(得分:1)

首先,您不需要自己解析XML,许多XML解析器可用于解析XML,您可以在解析后编辑值并再次将它们转换为XML。 你可以使用dom4j。

http://dom4j.sourceforge.net/

答案 1 :(得分:0)

你真的想用Java编写这种代码吗? XSLT非常容易,它专为完成这项工作而设计。您可以从Java轻松调用XSLT。