// **在NodeList上得到null nList = doc.getElementsByTagName(e);下面是我的xml内容 我试图删除xml文件中存在的类似标签。 nList显示为null。如何解决问题?
**
public class DelElement {
public static String parent;
public static void main(String[] args) {
try {
File file = new File("D:/vodafone/parse.xml");
DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document doc = dBuilder.parse(file);
System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
parent=doc.getDocumentElement().getNodeName();
if (doc.hasChildNodes()) {
printNote(doc,doc.getChildNodes());
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
private static void printNote(Document doc, NodeList nodeList) throws TransformerException {
String file = "D:/vodafone/parse.xml";
for (int count = 0; count < nodeList.getLength(); count++) {
Node tempNode = nodeList.item(count);
// make sure it's element node.
if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
// get node name and value
System.out.println("\nNode Name =" + tempNode.getNodeName() + " [OPEN]");
System.out.println("Node Value =" + tempNode.getTextContent());
if(tempNode.getNodeName()!=parent){
System.out.println("----------------------------");
if (tempNode.getChildNodes().getLength()>1){
NodeList nodeMap=tempNode.getChildNodes();
System.out.println("inside del");
for (int i=0;i<nodeMap.getLength();i++){
String e = "'"+(String)nodeMap.item(i).getNodeName()+"'";
System.out.println("inside del node:"+e);
NodeList nList = doc.getElementsByTagName(e);
if (nList.getLength()>1){
for (int con=1;i==nList.getLength()-1;con++){
Element el = (Element)nList.item(con);
System.out.println("element"+el);
System.out.println("parent"+el.getParentNode());
el.getParentNode().removeChild(el);
}
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(file));
transformer.transform(source, result);
}
}}}
if (tempNode.hasChildNodes()) {
// loop again if has child nodes
printNote(doc, tempNode.getChildNodes());
}
System.out.println("Node Name =" + tempNode.getNodeName() + " [CLOSE]");
}
}
}}
答案 0 :(得分:1)
问题似乎出现在您尝试删除节点的“for循环”中。你的循环说::“for(int con = 1; i == nList.getLength() - 1; con ++){”...基于你的代码,打破循环的条件“i == nList.getLength( )-1“总是如此,所以它永远不会进入那个区块......
我相信,这就是你应该做的事情(仍然觉得做一个非常小的工作有点令人费解;但我猜你只是分享了一部分难题......见下文;这将删除节点...
for (int con=nList.getLength()-1; con>=0; con--) {
Element el = (Element)nList.item(con);
System.out.println("element"+el);
System.out.println("parent"+el.getParentNode());
el.getParentNode().removeChild(el);
}
/*
for (int con=1;i==nList.getLength()-1;con++){
Element el = (Element)nList.item(con);
System.out.println("element"+el);
System.out.println("parent"+el.getParentNode());
el.getParentNode().removeChild(el);
}
*/
希望这有帮助。
答案 1 :(得分:0)
使用Xpath:
Document doc = ...
XPath xp = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xp.evaluate("//sai/test | //dinesh/test", doc, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); ++i) {
Node node = nodes.item(i);
node.getParentNode().removeChild(node);
}
TransformerFactory tf ....
更新:
上面的代码只是您可以做的一个示例:另一种方法可能是找到具有多个&lt; test&gt;的所有元素节点。 child,然后进行一些进一步的处理以删除重复项:
NodeList nodes = (NodeList) xp.evaluate("//node()[count(./test) > 1", doc, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); ++i) {
Node parent= nodes.item(i);
checkAndRemoveDuplicates(parent);
}
重点是XPath是一个功能强大的工具,可以帮助您用更少的代码解决问题。
答案 2 :(得分:-1)
看起来好像在你打电话
doc.getElementsByTagName(e);
e的值类似于&#34;&#39; test&#39;&#34;。但是,XML中的元素名称本身只是&#34; test&#34; (没有单引号)。这可能是你的罪魁祸首