Hi all,


This is sri. I've done some program to read xml elements in java.But i didnt get them in a structured way like root element and its name and child elements and their names.I am getting end tag names after tag value also.so pls help me in getting elements in a proper way.

//java code
import java.io.File;
import java.io.FileInputStream; 
import java.nio.ByteBuffer; 
import java.nio.CharBuffer;
import java.nio.channels.FileChannel; 
import java.nio.charset.Charset; 
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher; 
import java.util.regex.Pattern;



   public  class  XmlParse1 {
   static String mainPatternSrc = "(?s)\\G(?:" +"<!-.*?-->|" + "<\\?(.*?)\\?>|" + "<!\\[CDATA\\[(.*?)\\]\\]>|" + "<(/|)([\\w\\.\\-]+)([^>]*?)(/|)>|" + "([^<>]+))";
   static  Pattern  mainPattern  =  Pattern.compile(mainPatternSrc);

   private CharSequence seq; 
   private Matcher m;
   
   public XmlParse1(CharSequence seq) {
   this.seq = seq;
   }

   public boolean parseNext() { 
   if (m == null) {
   m = mainPattern.matcher(seq); 
   return true;
   }  
    else if (m.find()) {
      if (m.group(2) != null) {             
      text(m.group(2)); 
      }  
      else if(m.group(4)!=  null){
      if ("/".equals(m.group(3)))
      {  
      endElement(m.group(4));
      }
       else
       { 
       startElement(m.group(4));
       }
       } 
       else if(m.group(7) != null && !m.group(7).equals("")) { 
       text(translate(m.group(7)));
       }
       return true; 
       } 
       else{
       return false;
       }
      }
     
    static Map entityDefs = new HashMap(); 
     static {
     entityDefs.put("lt","<"); 
     entityDefs.put("gt",">"); 
     entityDefs.put("amp","&"); 
     entityDefs.put("quot","\""); 
     entityDefs.put("apos","'");
     }

  static  String  entityPatternSrc  =  "&#(\\d+);|&(\\w+);";
  static  Pattern  entityPattern  =  Pattern.compile(entityPatternSrc);
  
  private String translate(String s) { 
    Matcher m = entityPattern.matcher(s); 
     
    StringBuffer sb = null; 
    while(m.find()) {
      if(sb == null) 
      sb = new StringBuffer(); 
      if(m.group(1) != null) { 
         int i = Integer.parseInt(m.group(1)); 
         m.appendReplacement(sb,Character.toString((char) i)); 
         } 
         else {              
         String  entityStr  =  m.group(2);
         String entityVal = (String) entityDefs.get(entityStr); 
         if(entityVal != null) {
            m.appendReplacement(sb,entityVal); 
         } 
         else {
            throw  new  Error("Unkown  entity:  "+entityStr);
         }
        }
     }
      if(sb != null)  { 
         m.appendTail(sb); 
            
	return sb.toString();
       }
      else 
       { 
         return s;
       }
   }
    
    //events

      public void endElement(String s) 
      {
        //System.out.println(s);   
      }
      public  void  startElement(String  s)  
      {
        System.out.print(s+":");
      }
     public  void  text(String  s)
 
      {
         System.out.print(s);
      }
      


 public static void main(String[] args) throws Exception { 
  
  System.out.println(mainPatternSrc);
  File f = new File(args[0]);
  FileInputStream fis = new FileInputStream(f); 
  ByteBuffer bb =fis.getChannel().map(FileChannel.MapMode.READ_ONLY,0,f.length()); 
  CharBuffer cb = Charset.forName("UTF-8").decode(bb);

  XmlParse1 xp = new XmlParse1(cb); 
  while(xp.parseNext()) {
  }

 }

}

/* xml code
<?xml version="1.0" ?>

<Company>

     <Project>

       <title>Beacon</title>
       
       <frontend>php</frontend>
       
       <backend>mysql</backend>
       
       <client>Aircel</client>
       
       <team_size>20</team_size>
     
     </Project>


     <Project>
     
       <title>IONI</title>
       
       <frontend>php</frontend>
       
       <backend>mysql</backend>
       
       <client>Infosys</client>
       
       <team_size>5</team_size>
     
     </Project>

</Company>
*/
This article has been dead for over six months. Start a new discussion instead.