我已经编写了java代码来从xml标签中获取节点,并且基于该节点,它应该被删除。对于相同条件的某些情况它工作正常并且它对某些情况不起作用。我一直试图找到一个解决方案但无法解决。 Plz帮助我们.Below是我写的代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class CL_RGTIS_CREMAS_DWM_FILT {
/**
* @param args
*/
public static void main(String[] args)
{
CL_RGTIS_CREMAS_DWM_FILT domParse=new CL_RGTIS_CREMAS_DWM_FILT();
try
{
FileInputStream in=new FileInputStream("C:/Users/Home/Downloads/Test1.xml");
FileOutputStream out = new FileOutputStream("C:/Users/Home/Downloads/out.xml");
domParse.execute(in,out);
}
catch(Exception e)
{
System.out.println("catch exception"+e.getMessage());
}
}
public void execute(FileInputStream in,FileOutputStream out)
{
try
{
TransformerFactory transformerFactory=TransformerFactory.newInstance();
Transformer transformer=transformerFactory.newTransformer();
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
//ignore whitespace within document
factory.setIgnoringElementContentWhitespace(true);
/*parser is aware of name space*/
factory.setNamespaceAware(true);
DocumentBuilder builderel=factory.newDocumentBuilder();
Document docIn=builderel.parse(in);
Node root, headerItem = null,childItem=null,childItem1=null;
NodeList id, headerNodes = null,childNodes=null,childNodes1=null;
id = docIn.getElementsByTagName("IDOC");
for (int g =0; g< id.getLength(); g++)
{
root = id.item(g);
headerNodes = root.getChildNodes();
for(int j =0; j<headerNodes.getLength(); j++)
{
headerItem = headerNodes.item(j);
childNodes=headerItem.getChildNodes();
for(int k=0;k<childNodes.getLength();k++)
{
childItem=childNodes.item(k);
childNodes1=childItem.getChildNodes();
if((childItem.getNodeName().equalsIgnoreCase("E1LFB1M"))||(childItem.getNodeName().equalsIgnoreCase("E1LFBKM")))
{
childItem.getParentNode().removeChild(childItem);
System.out.println("in if stmt");
}
}
}
}
DOMSource dom = new DOMSource(docIn);
StreamResult result = new StreamResult(out);
transformer.transform(dom, result);
}
catch(Exception e)
{
System.out.println("execute method"+e.getMessage());
}
}
}
答案 0 :(得分:0)
在k循环中,代码删除了k th childItem。我不是最微妙的想法,NodeList是否由实际的DOM节点支持。您可以尝试递减k,这样您就不会无意中跳过for k++
上的下一个项目。
在每种情况下,当k递减时,k < childNodes.getLength()
将迭代少一次。
childItem.getParentNode().removeChild(childItem);
--k;
当然,更便携,更安全的解决方案应该更好;在循环内收集要删除的项目列表。
答案 1 :(得分:0)
假设有6个标签带有E1LfBKM标签,那么它只有4次进入if块而其余2个被忽略。但实际上它应该进入if语句6次。这就是我的意思当我说案件时。