2016-02-08 2 views
0

У меня возникли проблемы с SAX Parser, где он не извлекает полный XML-документ. Я вижу, что это происходит из списка, так как только 1 запись добавляется в список, когда действительно должно быть 3 записи.SAX Parser не отображает полный XML

Может ли кто-нибудь решить проблему, разрешив отображение всех трех записей? Спасибо.

catalogue.xml

<?xml version="1.0" ?> 
 
<CATALOG> 
 
    <BOOK> 
 

 
    <TITLE>A Certain Justice</TITLE> 
 
    <AUTHOR>P.D. James</AUTHOR> 
 
    <YEAR-PUBLISHED>1998</YEAR-PUBLISHED> 
 
    <ISBN>0375401091</ISBN> 
 

 
    </BOOK> 
 
    <BOOK> 
 

 
    <TITLE>Ashworth Hall</TITLE> 
 
    <AUTHOR>Anne Perry</AUTHOR> 
 
    <YEAR-PUBLISHED>1997</YEAR-PUBLISHED> 
 
    <ISBN>0449908445</ISBN> 
 

 
    </BOOK> 
 
    <BOOK> 
 

 
    <TITLE>L.A. Confidential</TITLE> 
 
    <AUTHOR>James Ellroy</AUTHOR> 
 
    <YEAR-PUBLISHED>1997</YEAR-PUBLISHED> 
 
    <ISBN>0446674249</ISBN> 
 

 
    </BOOK> 
 
    <BOOK> 
 

 
    <TITLE>Shadow Woman</TITLE> 
 
    <AUTHOR>Thomas Perry</AUTHOR> 
 
    <YEAR-PUBLISHED>1997</YEAR-PUBLISHED> 
 
    <ISBN>0679453024</ISBN> 
 

 
    </BOOK> 
 

 
</CATALOG>

Catalogue.java

package londonmet.cs.xml; 
 

 
public class Catalogue { 
 

 
    public String title; 
 
    public String author; 
 
    public String yearPublished; 
 
    public String isbn; 
 

 
    public String getTitle() { 
 
    return title; 
 
    } 
 
    public void setTitle(String title) { 
 
    this.title = title; 
 
    } 
 
    public String getAuthor() { 
 
    return author; 
 
    } 
 
    public void setAuthor(String author) { 
 
    this.author = author; 
 
    } 
 
    public String getYearPublished() { 
 
    return yearPublished; 
 
    } 
 
    public void setYearPublished(String yearPublished) { 
 
    this.yearPublished = yearPublished; 
 
    } 
 
    public String getIsbn() { 
 
    return isbn; 
 
    } 
 
    public void setIsbn(String isbn) { 
 
    this.isbn = isbn; 
 
    } 
 

 
    @ 
 
    Override 
 
    public String toString() { 
 
    return "Catalogue:: Title=" + this.title + " Author=" + this.author + " Year Published=" + this.yearPublished + 
 
     " ISBN=" + this.isbn; 
 
    } 
 

 

 

 

 

 
}

SAXParserExample.java

package londonmet.cs.xml; 
 

 

 

 
import java.io.IOException; 
 
import java.util.ArrayList; 
 
import java.util.Iterator; 
 
import java.util.List; 
 

 
import javax.xml.parsers.ParserConfigurationException; 
 
import javax.xml.parsers.SAXParser; 
 
import javax.xml.parsers.SAXParserFactory; 
 

 
import org.xml.sax.Attributes; 
 
import org.xml.sax.SAXException; 
 

 
import org.xml.sax.helpers.DefaultHandler; 
 

 
public class SAXParserExample extends DefaultHandler { 
 

 
    List <Catalogue> myCata; 
 

 
    private String tempVal; 
 

 
    //to maintain context 
 
    private Catalogue tempEmp; 
 

 

 
    public SAXParserExample() { 
 
    myCata = new ArrayList <Catalogue>(); 
 
    } 
 

 
    public void runExample() { 
 
    parseDocument(); 
 
    printData(); 
 
    } 
 

 
    private void parseDocument() { 
 

 
    //get a factory 
 
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
 
    try { 
 

 
     //get a new instance of parser 
 
     SAXParser sp = spf.newSAXParser(); 
 

 
     //parse the file and also register this class for call backs 
 
     sp.parse("catalogue.xml", this); 
 

 
    } catch (SAXException se) { 
 
     se.printStackTrace(); 
 
    } catch (ParserConfigurationException pce) { 
 
     pce.printStackTrace(); 
 
    } catch (IOException ie) { 
 
     ie.printStackTrace(); 
 
    } 
 
    } 
 

 
    /** 
 
    * Iterate through the list and print 
 
    * the contents 
 
    */ 
 
    private void printData() { 
 

 
    System.out.println("No of Books '" + myCata.size() + "'."); 
 

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

 

 
    //Event Handlers 
 
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
 
    //reset 
 
    tempVal = ""; 
 
    if (qName.equalsIgnoreCase("Catalog")) { 
 
     //create a new instance of employee 
 
     tempEmp = new Catalogue(); 
 

 
    } 
 
    } 
 

 

 
    public void characters(char[] ch, int start, int length) throws SAXException { 
 
    tempVal = new String(ch, start, length); 
 
    } 
 

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

 
    if (qName.equalsIgnoreCase("Catalog")) { 
 
     //add it to the list 
 
     myCata.add(tempEmp); 
 

 
    } else if (qName.equalsIgnoreCase("TITLE")) { 
 
     tempEmp.setTitle(tempVal); 
 
    } else if (qName.equalsIgnoreCase("AUTHOR")) { 
 
     tempEmp.setAuthor(tempVal); 
 
    } else if (qName.equalsIgnoreCase("YEAR-PUBLISHED")) { 
 
     tempEmp.setYearPublished(tempVal); 
 
    } else if (qName.equalsIgnoreCase("ISBN")) { 
 
     tempEmp.setIsbn(tempVal); 
 
    } 
 

 
    } 
 

 
    public static void main(String[] args) { 
 
    SAXParserExample spe = new SAXParserExample(); 
 
    spe.runExample(); 
 
    } 
 

 
}

ответ

3

Вы хотите, чтобы собрать информацию о каждом элементе BOOK в документе XML.

Поэтому в startElement и endElement вы должны следить за началом и концом BOOK и не CATALOG элементы:

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException 
{ 
    // reset 
    tempVal = ""; 
    if (qName.equalsIgnoreCase("BOOK")) // not CATALOG 
     ... 
} 


public void endElement(String uri, String localName, String qName) throws SAXException 
{ 
    if (qName.equalsIgnoreCase("BOOK")) // not CATALOG 
    { 
     // add it to the list 
     myCata.add(tempEmp); 
    } 
    ... 

Следовательно, вы должны переименовать Catalogue класс в Book класс, так как он представляет собой одну книгу, а не каталог (= сборник книг).