2013-04-19 2 views
0

Мне нужно проанализировать XML-файл, чтобы получить значения тегов, присутствующих в XML-файле. Я сделал это частично и застрял в середине. мой файл XML выглядит следующим образом (пример XML-файл)синтаксический анализ Внутренние теги XML-файла

<?xml version="1.0" encoding="UTF-8"?> 
<database> 
<student name="abc"> 
<phone>6879987</phone> 
<dept>eee</dept> 
<college>act</college> 
<semester> 
<year>2</year> 
<no.of.sub>7</no.of.sub> 
</semester> 
<hostel> 
<year>3</year> 
<block>d4</block> 
</hostel> 
</student> 
<student name="ram"> 
<phone>65464</phone> 
<dept>cse</dept> 
<college>Mit</college> 
<semester> 
<year>4</year> 
<no.of.sub>5</no.of.sub> 
</semester> 
<hostel> 
<year>5</year 
<block>y4</block> 
</hostel> 
</student> 
</database> 

Моя реализация выглядит следующим образом,

public class MySaxParser extends DefaultHandler { 
    private String temp; 
    private ArrayList<Account> accList = new ArrayList<Account>(); 
    private Account acct; 


    public static void main(String[] args) throws IOException, SAXException, 
       ParserConfigurationException { 


      SAXParserFactory spfac = SAXParserFactory.newInstance(); 


      SAXParser sp = spfac.newSAXParser(); 


      MySaxParser handler = new MySaxParser(); 


      sp.parse("test.xml", handler); 

      handler.readList(); 

    } 



    @Override 
    public void characters(char[] buffer, int start, int length) { 
      temp = new String(buffer, start, length); 
    } 



    @Override 
    public void startElement(String uri, String localName, 
       String qName, Attributes attributes) throws SAXException { 
      temp = ""; 
      if (qName.equalsIgnoreCase("Student")) { 
       acct = new Account(); 
       //acct.setType(attributes.getValue("type")); 

      } 
    } 

    @override 
    public void endElement(String uri, String localName, String qName) 
       throws SAXException { 

      if (qName.equalsIgnoreCase("Student")) { 
       // add it to the list 
       accList.add(acct); 

      } else if (qName.equalsIgnoreCase("phone")) { 
       acct.setphone(temp); 
      } else if (qName.equalsIgnoreCase("dept")) { 
       acct.setdept((temp)); 
      } else if (qName.equalsIgnoreCase("College")) { 
       acct.setcollege(temp); 

      } 
    } 



    private void readList() { 

      Iterator<Account> it = accList.iterator(); 
      while (it.hasNext()) { 
       System.out.println(it.next().toString()); 
      } 
    } 

} 

Это возможно для меня, чтобы разобрать значения телефона, DEPT колледжа. Но year tag - это заголовок как семестра, так и общежития. Мне нужно получить и стоимость года. когда я просто использую,

else if (qName.equalsIgnoreCase("year")) { 
    acct.setyear(temp); 

только год значения общежития печатается, пропуская семестр. 1) как я могу разобрать эти подтеки. Заранее спасибо

ответ

0

Да, это потому, что тег общежития приходит после семестра. Итак, вы всегда получаете самый последний тег. Если вы хотите печатать оба, вы используете несколько логических флагов, таких как isSemester и isHotel, и задавайте их по мере их появления. Затем, когда вы встретите год, проверьте эти флаги и посмотрите, к какому из них относится текущий год.

+0

Хорошо, попробуй ... – sreram

0

Вам нужен способ «запомнить», внесли ли вы тэг hostel или нет. Простейший способ будет сделать следующее внутри startElement:

if (qName.equalsIgnoreCase("hostel")) { 
    this.insideHostel = true; 
} 

И в endElement:

if (qName.equalsIgnoreCase("hostel")) { 
    this.insideHostel = false; 
} 

Теперь вы можете сделать: файл XML

} else if (qName.equalsIgnoreCase("year") && insideHostel) { 
    acct.setyear(temp); 
} 
+0

Хорошо, конечно. 'сделаем попытку – sreram

0

образец,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <Issue> 
    <Primary> 
    <Section>  
      String a=null; 
      if(a==null) hi;); 
      else bye;; 
       } 
    </Section> 
    </Primary> 
    <Source> 
    <Section> 
       String a="sbi"; 
       if(a==null) hi;); 
       else bye;; 
    </Section> 
    </Source> 
    </Issue> 

Мне нужно получить все символы в теге раздела. Моя реализация следующая:

 public void endElement(String uri, String localName, String qName) 
      throws SAXException { 

     if (qName.equalsIgnoreCase("Issue")) { 

      accList.add(acct); 

     } 
     if (qName.equalsIgnoreCase("Primary")) { 

      this.isPrimary=false; 

     } 
     if (qName.equalsIgnoreCase("Source")) { 
      this.isSource=false; 

     } 

    else if(qName.equalsIgnoreCase("section")&&isPrimary) 
      { 
       acct.setPrimarySnippet(temp); 
      } 
      else if(qName.equalsIgnoreCase("Section")&&isSource) 
      { 
       acct.setSourceSnippet(temp); 
      } 

o/p is: else bye ;; },

+0

Как получить печать всех символов в теге раздела ?? – sreram

Смежные вопросы