0

xml 解析に org.w3c.dom.Document を使用しています。サーバーに次のような 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 ノードが表示されますが、これはすべきではありません。ノードを削除する適切な方法を使用しているかどうかを教えてください。

ありがとう

4

2 に答える 2

1

ノード リストでノードを削除すると、DOM によってノードが再配置され、インデックスが正しくなくなります。

DOM 内の NodeList および NamedNodeMap オブジェクトはライブです。つまり、基礎となるドキュメント構造への変更は、関連するすべての NodeList および NamedNodeMap オブジェクトに反映されます。

kiddo のソリューションは機能しましたが、効果がない可能性があります。なので、ちょっとだけ編集。

int j = 0;
for(int i =0 ; i < nList.getLength();)
{
   //operation/

  //remove case match
   {
     //remove
     i=j;
     continue;
   } else {
     j++;
   }
  i++
}

私はそれを試してみましたが、うまくいきました。

于 2014-03-27T17:52:18.540 に答える
1

forループで、ノードを削除すると、xmlノードの合計サイズが1減少し、xml構造が再配置されることに気付きました..したがって、1ノードさらに進みます。コードを次のように変更しました

for(int i =0 ; i < nList.getLength();)
{
   //operation/

  //remove case match
   {
     //remove
     i=0;
     contiune;
   }
  i++
}

これは私のために働いた!!!

于 2013-03-14T16:41:09.093 に答える