2016-03-24 3 views
0

У меня есть XML-файл, и я хочу получить данные от него с помощью SAX. Он доходит до startElement(), где он получает ошибку, потому что, когда я пытаюсь получить значение атрибутов, они равны нулю. Зачем?Java - SAXParser и XMLReader получает значение нулевых атрибутов

Прежде всего, я называю этот метод: нагрузки()

public RealEstate load() { 
     RealEstate data = null; 
     try {  
      //Create a "parser factory" for creating SAX parsers 
      SAXParserFactory spfac = SAXParserFactory.newInstance(); 

      //Now use the parser factory to create a SAXParser object 
      SAXParser sp = spfac.newSAXParser(); 
      XMLReader xmlReader = sp.getXMLReader(); 

      //Create an instance of this class; it defines all the handler methods 
      SaxParserRealEstateHandler handler = new SaxParserRealEstateHandler(); 

      //assign our handler 
      xmlReader.setContentHandler(handler); 

      // Convert file to URL. 
      URL url = handler.fileToURL(new File(xmlFilename)); 

      // Parse file. 
      xmlReader.parse(url.toString()); 

      data = handler.getData(); 

     } catch (ParserConfigurationException ex) { 
      Logger.getLogger(RealStatePersistXML.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     catch (SAXException ex) { 
      Logger.getLogger(RealStatePersistXML.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     catch (IOException ex) { 
      Logger.getLogger(RealStatePersistXML.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return data; 
    } 

Здесь у меня есть методы StartElement и EndElement. Код

class SaxParserRealEstateHandler extends DefaultHandler 
    { 

     private String temp; 
     private RealEstate data; 
     private Estate estate; 
     private estateAddress address; 

     /** 
     * CONSTRUCTOR 
     */ 
     public SaxParserRealEstateHandler() 
     { 
     } 


     /** 
     * getData() 
     * This method gets the list of estates from RealEstate class. 
     * @return data list of states. Null in case of error or list not found. 
     */ 
     public RealEstate getData() 
     { 
     // RealEstate data = new RealEstate(); 
      // data.addEstate(estate); 
      // data.getEstates(); 
     // return data; 
     } 

     /* 
     * When the parser encounters plain text (not XML elements), 
     * it calls(this method, which accumulates them in a string buffer 
     */ 
     public void characters(char[] buffer, int start, int length) { 
      temp = new String(buffer, start, length); 
     } 


     /* 
     * Every time the parser encounters the beginning of a new element, 
     * it calls this method, which resets the string buffer 
     */ 
     public void startElement(String uri, String localName, String qName, Attributes attributes){ 

      switch (qName){  
       case"realState": 
        data = new RealEstate(); 
        break; 
       case"estate": 
        estate = new Estate(); 
        estate.setType(attributes.getValue("type")); 
        estate.setSurface(Double.parseDouble(attributes.getValue("surface"))); 
        //estate.setAddress(attributes.getValue("address")); 
        estate.setPrice(Integer.parseInt(attributes.getValue("price"))); 
        break;  
       case"address": 
        address = new estateAddress(); 
        address.setStreet(attributes.getValue("type")); 
        address.setNumber(Integer.parseInt(attributes.getValue("surface"))); 
        address.setFloor(Integer.parseInt(attributes.getValue("type"))); 
        address.setDoor(Integer.parseInt(attributes.getValue("surface"))); 
        break; 
       default: 
        break; 
      } 
     } 



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

    switch (qName){ 
     case"estate": 
      data.getEstates().add(estate);//quant ha llegit la etiqueta (</estate>) l'agreguem 
      break; 
     case"surface": 
      double surface = Double.parseDouble(temp); 
      estate.setSurface(surface); 
      break; 
     case"price": 
      double price = Double.parseDouble(temp);//tractar tema errors del parseDouble! 
      estate.setPrice(price); 
      break;  
     case"address":      
      estate.setAddress(address); 
      break;  
     case"street": 
      address.setStreet(temp); 
      break; 
     case"number": 
      int number = Integer.parseInt(temp); 
      address.setNumber(number); 
      break; 
     case"floor": 
      address.setStreet(temp); 
      break; 
     case"door": 
      address.setStreet(temp); 
      break; 
     default: 
      break; 
    } 
} 



/** fileToURL() 
* Convenience method to convert a file to a url 
* @throws Error if malformed url exception is generated 
*/ 

    public URL fileToURL(File file) 
{ 
    String path = file.getAbsolutePath(); 
    String fSep = System.getProperty("file.separator"); 
    if (fSep != null && fSep.length() == 1) 
     path = path.replace(fSep.charAt(0), '/'); 
    if (path.length() > 0 && path.charAt(0) != '/') 
     path = '/' + path; 
    try 
    { 
     return new URL("file", null, path); 
    } 
    catch (java.net.MalformedURLException e) 
    { 
     throw new Error("Unexpected MalformedURLException");//no he pogut muntar una url com deu mana 
     //retornar null 
    } 
} 
    } 

XML код

<?xml version="1.0" encoding="UTF-8"?> 
<realState xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="realState.xsd"> 
    <estate> 
     <type>House</type> 
     <surface>250,0</surface> 
     <address> 
      <street>C/Tarragona</street> 
      <number>54</number> 
      <floor>2</floor> 
      <door>1</door> 
     </address> 
     <price>140000,0</price> 
    </estate> 
</realState> 

XSD: http://pastebin.com/nzEDsdLg

Классы RealEstate и недвижимости работают нормально!

Спасибо!

ответ

0

type, surface и price не атрибуты о <estate> элемента. Это подэлементы.

Чтобы быть атрибуты, XML будет:

<estate type="House" surface="250,0" price="140000,0"> 
    <address> 
     <street>C/Tarragona</street> 
     <number>54</number> 
     <floor>2</floor> 
     <door>1</door> 
    </address> 
</estate> 

Использование парсера StAX намного проще, чем SAX парсер, и имеет очень сходные характеристики производительности, поэтому я предлагаю вам использовать это вместо этого.

+0

И что мне нужно изменить, если я не хочу менять код XML? –

+0

Отбросьте 'setType (attributes.getValue (" type "))' call. Я имею в виду, что вы уже записали код, необходимый для установки значения в методе 'endElement()', поэтому прямо сейчас вы пытаетесь установить значение дважды. – Andreas

+0

ОК! Я уже удалил его, но теперь программа заканчивается без запуска метода endElement. –

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

  • Нет связанных вопросов^_^