我在尝试遍历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;
}
任何帮助都将不胜感激。
谢谢
安迪
答案 0 :(得分:1)
首先,您不需要自己解析XML,许多XML解析器可用于解析XML,您可以在解析后编辑值并再次将它们转换为XML。 你可以使用dom4j。
答案 1 :(得分:0)
你真的想用Java编写这种代码吗? XSLT非常容易,它专为完成这项工作而设计。您可以从Java轻松调用XSLT。