2011-12-27 30 views
2

我需要在java中使用SAX解析器解析文檔。如果我使用傳統上實現startElement,endElement和characters方法的DefaultHandler類,我能夠打印所有節點值。我們如何訪問子節點上的前一個節點值,我該怎麼做?
我的示例XML是:當我使用SAX解析器時,如何獲得父節點?

<staff> 
     <firstname>yong</firstname> 
     <lastname>mook kim</lastname> 
     <nickname>mkyong</nickname> 
     <salary>100000</salary> 
    </staff> 
    <staff> 
     <firstname>low</firstname> 
     <lastname>yin fong</lastname> 
     <nickname>fong fong</nickname> 
     <salary>200000</salary> 
    </staff> 

基於工資節點值,我也想訪問的第一個名字。我很困惑。我們該怎麼做?我的示例代碼:

SAXParserFactory factory = SAXParserFactory.newInstance(); 
    SAXParser saxParser = factory.newSAXParser(); 

    DefaultHandler handler = new DefaultHandler() { 

    boolean bfname = false; 
    boolean blname = false; 
    boolean bnname = false; 
    boolean bsalary = false; 

    public void startElement(String uri, String localName,String qName, 
       Attributes attributes) throws SAXException { 

     System.out.println("Start Element :" + qName); 

     if (qName.equalsIgnoreCase("FIRSTNAME")) { 
      bfname = true; 
     } 

     if (qName.equalsIgnoreCase("LASTNAME")) { 
      blname = true; 
     } 

     if (qName.equalsIgnoreCase("NICKNAME")) { 
      bnname = true; 
     } 

     if (qName.equalsIgnoreCase("SALARY")) { 
      bsalary = true; 
     } 

    } 

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

     System.out.println("End Element :" + qName); 

    } 

    public void characters(char ch[], int start, int length) throws SAXException { 

     if (bfname) { 
      System.out.println("First Name : " + new String(ch, start, length)); 
      bfname = false; 
     } 

     if (blname) { 
      System.out.println("Last Name : " + new String(ch, start, length)); 
      blname = false; 
     } 

     if (bnname) { 
      System.out.println("Nick Name : " + new String(ch, start, length)); 
      bnname = false; 
     } 

     if (bsalary) { 
      //System.out.println("Salary : " + new String(ch, start, length)); 
        String nodeValue=new String(ch, start, length); 
        if(nodeValue.compareTo("100000")==0) 
        { 
        **????I need to store the respective respective first name 
         in ArrayList** 
        } 
      bsalary = false; 
     } 

    } 

    }; 

回答

1

您可以使用一個字符串變量的,這個變量在最後保存爲

public void characters(char ch[], int start, int length) throws SAXException { 
    ... Code Here ...  
    if (bfname) { 
     employeeName = new String(ch, start, length); 
     bfname = false; 
    } 
    ... Code Here ... 
} 

&用作

public void characters(char ch[], int start, int length) throws SAXException { 
    ... Code Here ... 
    if (bsalary) { 
     String nodeValue=new String(ch, start, length);\ 
      if(nodeValue.compareTo("100000")==0) 
      { 
       //Use employeeName Here... 
      } 
     bsalary = false; 
    } 
    ... Code Here ... 
} 
3

使用SAX時,您無法來回導航。你應該嘗試使用DOM。如果您必須使用SAX,那麼您可以使用Stack來保存以前的數據並根據需要彈出它們。

相關問題