2016-03-24 10 views
0

Bir XML dosyanız var ve SAX ürününü kullanmamalı. startElement() öğesinin sonuna kadar gider, çünkü öznitelik değerini almaya çalıştığımda bunlar boştur. Niye ya? Her şeydenJava - SAXParser ve XMLReader null öznitelikleri alır değer

Önce bu yöntemi çağırın: yükü() İşte

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

Ben yöntemleri startElement ve endElement var.

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 kodu

<?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 kodu: http://pastebin.com/nzEDsdLg

Sınıflar RealEstate ve Emlak Tamam çalışıyoruz!

Teşekkür ederiz!

cevap

0

type, surface ve price<estate> elemanın nitelikleri değildir. Bunlar alt elementlerdir. Bir SAX ayrıştırıcı çok daha kolay ve çok benzerlik taşımaktadır Bir StAX ayrıştırıcı kullanarak

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

, bu yüzden onu kullanabilirsiniz önermek:

nitelikleri olmak için, size XML olurdu.

+0

XML kodunu değiştirmek istemediğimde neyi değiştirmem gerekiyor? –

+0

'setType (attributes.getValue (" type "))' aramasını bırakın. Yani, 'endElement()' yöntemindeki değeri ayarlamak için gerekli kodu zaten yazdınız, bu yüzden şimdi değeri iki kez ayarlamaya çalışıyorsunuz. – Andreas

+0

tamam! Onu zaten sildim, ama şimdi program, endElement yöntemini çalıştırmadan sona eriyor. –