我正在使用 org.w3c.dom.Document 进行 xml 解析。我的服务器中有一个 xml 文件,例如..
<query><item access='server1'><item access='server2'><item access='server3'></query>
我将读取此 xml 文件,并根据某些选项动态删除任何节点(server1 或 server2 或 server3)并将结果作为字符串返回,以便我可以在我的用户界面之一中显示。下面是代码
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setIgnoringComments(true);
inputStream = new FileInputStream(new File(filename));
org.w3c.dom.Document doc = documentBuilderFactory.newDocumentBuilder().parse(inputStream);
Element rootNode = doc.getDocumentElement();
if(filename.endsWith("items.xml"))//load the enabled items
{
NodeList nList = doc.getElementsByTagName("item");
for(int i = 0; i < nList.getLength(); i++)
{
try
{
Node node = nList.item(i);
if((node.getNodeType() == Node.ELEMENT_NODE))
{
Element ele = (Element)node;
String access = (String)ele.getAttribute("access");
String level = access.substring(0,access.indexOf("."));
if(!LevelManager.isLevelEnabled(level))
{
rootNode.removeChild(node);
}
}
else
{
System.out.println("NO ELEMENT NODE");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
doc.normalize();
StringWriter stw = new StringWriter();
Transformer serializer = TransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"yes");
serializer.transform(new DOMSource(doc), new StreamResult(stw));
discfeatures = stw.toString();
return discfeatures;
}
catch(Exception w)
{
}
现在,问题是 ---> 有时节点不会被删除。例如,如果我删除 server1 属性节点 - 它会被删除。然后我再次尝试删除 server2 属性节点。它显示了不应该的 server1 节点。请告诉我我是否使用正确的方法删除节点。
谢谢
最佳答案
我刚刚意识到,在 for 循环中,一旦删除节点,xml 节点的总大小就会减少 1,并且 xml 结构会重新排列。因此它将进一步前进 1 个节点。 我将代码更改为
for(int i =0 ; i < nList.getLength();)
{
//operation/
//remove case match
{
//remove
i=0;
contiune;
}
i++
}
这对我有用!!!
关于java - 使用java中的Document删除xml中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411643/