2016-07-22 72 views
1

執行以下操作所需的Java代碼。 林具有XML作爲字符串,例如Java XML解析刪除節點

<EMpData> 
<Employee1> 
    <Address1>XYZ<Address1/> 
    <city>DDD<city/> 
<Employee1/> 
<Employee2> 
    <Address1><Address1/> 
    <city><city/> 
<Employee2/> 
<EMpData/> 

我不得不檢查是否有任何的子節點是空的或無效或不具有值,如果它是存在的話,我必須刪除父節點和子節點。所以在上面和Employee2是空的,我想下面的輸出

<EMpData> 
<Employee1> 
    <Address1>XYZ<Address1/> 
    <city>DDD<city/> 
<Employee1/> 
<EMpData/> 

請推薦給做最好的和有效的方式。實際的xml將大約500到700行。

+0

那你試試? –

回答

0

這是基於XPath和VTD-XML的代碼..

import java.io.*; 
import com.ximpleware.*; 

public class removeNode2 { 
    public static void main(String s[]) throws VTDException, IOException{ 
     VTDGen vg = new VTDGen(); 
     String xml = "<EMpData>\n"+ 
       "<Employee1>\n"+ 
       "<Address1>XYZ</Address1>\n"+ 
       "<city>DDD</city>\n"+ 
       "</Employee1>\n"+ 
       "<Employee2>\n"+ 
       "<Address1></Address1>\n"+ 
       "<city></city>\n"+ 
       "</Employee2>\n"+ 
       "</EMpData>\n"; 
     vg.setDoc(xml.getBytes()); 
     vg.parse(false); 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     XMLModifier xm = new XMLModifier(vn); 
     ap.selectXPath("/EMpData/*[string-length(*/text())=0]"); 

     int i=0; 
     while((i=ap.evalXPath())!=-1){ 
      //System.out.println(" -====>"+ap2.evalXPathToBoolean()); 
      xm.remove(); 
     } 
     ByteArrayOutputStream baos= new ByteArrayOutputStream(); 
     xm.output(baos); 
     System.out.println(baos.toString()); 
    } 
}