Как я могу получить родительский узел, когда я использую SAX-парсер? - PullRequest
2 голосов
/ 27 декабря 2011

Мне нужно разобрать документ, используя SAX-парсер в Java.Я смог напечатать все значения узлов, если я использую класс DefaultHandler, традиционно реализующий метод startElement, endElement и characters.Как мы можем получить доступ к предыдущему значению узла на дочернем узле, как я могу это сделать?
Мой пример XML:

<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;
        }

    }

     };

Ответы [ 2 ]

3 голосов
/ 27 декабря 2011

Вы не можете перемещаться вперед и назад при использовании SAX. Вы должны попробовать использовать DOM. Если вам нужно использовать SAX, тогда вы можете использовать Stack для хранения предыдущих данных и извлекать их по мере необходимости.

1 голос
/ 27 декабря 2011

Вы можете использовать строковую переменную, чтобы сохранить имя как

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 ...
}
...