2017-01-24 8 views
0

私はstaxでxmlを解析しようとしています。 私はXMLでこのラインに行くよ後 -サックスパーサーはxmlから空の文字列を返します

<temperature>38</temperature> 

私は空の文字列値を取得しています。なぜこれが起こるのですか?私はこれを解決するために何ができますか? 私のxml:

<?xml version="1.0" encoding="UTF-8"?> 
<flowers> 
    <flower name="rose"> 
     <soil>podzolic</soil> 
     <visualParameters> 
      <stemColor>Green</stemColor> 
      <leafColor>Red</leafColor> 
      <averageSize>50</averageSize> 
     </visualParameters> 
     <growingTips> 
      <temperature>38</temperature> 
      <watering>1200</watering> 
      <value>photophilous</value> 
     </growingTips> 
    <multiplying>bySeeds</multiplying> 
    <origin>Belarus</origin> 
     <description>Classic Choice</description> 
    </flower> 
</flowers> 

私のコード:

List<Flower> getFlowerList() { 
     return flowerList; 
    } 
    public void startElement(String namespaceURI, String localName, String qName, Attributes attrs) throws SAXException { 
     switch (qName) { 
      case "flowers": 
       flowerList = new ArrayList<Flower>(); 
       break; 
      case "flower": 
       flower = new Flower(); 
       flower.setName(attrs.getValue("name")); 
       break; 
      case "visualParameters": 
       visual = new VisualParameters(); 
       break; 
      case "GrowingTips": 
       tips = new GrowingTips(); 
       break; 
     } 

    } 
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException { 
     switch (qName) { 
      case "flower": 
       flowerList.add(flower); 
       break; 
      case "soilType": 
       soil = new SoilType(); 
       soil.setValue(SoilName.fromValue(content)); 
       break; 
      case "origin": 
       flower = new Flower(); 
       flower.setOrigin(content); 
       break; 
      case "averageSize": 
        visual.setAverageSize(Integer.valueOf(content)); 
       flower.setParameters(visual); 
       break; 
      case "leafColor": 
       visual.setLeafColor(content); 
       flower.setParameters(visual); 
       break; 
      case "temperature": 
      //in this line content = "" 
       tips.setTemperature(Integer.valueOf(content)); 

       break; 
      case "stemColor": 
       visual.setStemColor(content); 
       flower.setParameters(visual); 
       break; 
      case "watering": 
       tips.setWatering(Integer.valueOf(content)); 
       break; 
      case "lightingType": 
       tips.setValue(LightingName.fromValue(content)); 
       break; 
      case "multiplying": 
       multiplyingType = new MultiplyingType(); 
       multiplyingType.setValue(MultiplyingName.fromValue(content)); 
       break; 
      case "description": 
       flower.setDescription(content); 
       break; 
     } 

    } 
public void characters(char[] ch, int start, int length) { 
     content = String.copyValueOf(ch, start, length).trim(); 
    } 

とスタックトレース:

java.lang.NullPointerException 
    at tasks.five.parser.SAXHandler.endElement(SAXHandler.java:75) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source) 
    at javax.xml.parsers.SAXParser.parse(Unknown Source) 
    at tasks.five.parser.SAXParserClass.SAXParser(SAXParserClass.java:22) 
    at tasks.five.command.SAXParserCommand.execute(SAXParserCommand.java:13) 
    at tasks.five.command.CommandExecutor.execute(CommandExecutor.java:21) 
    at tasks.five.runner.Main.main(Main.java:14) 

答えて

1

startElement()であなたのケースコードは"GrowingTips"代わりの"growingTips"を探している、とcase文がケースです感受性が高い。だからendElement()コードでは、温度を設定しようとするとtipsがnullになり、NullPointerExceptionがスローされます。

+0

ありがとうございます。なぜ私はそれに気づかないのですか?問題はそれ以上にグローバルだと思う;) –

1

あなたcharacters()方法が間違っている:

content = String.copyValueOf(ch, start, length).trim(); 

テキストデータはチャンクにパーサが選択した任意の方法を分割し、characters()の複数の呼び出しで送達することができます。毎回それを上書きするのではなく、contentの値に追加する必要があります。

+0

アドバイスをいただきありがとうございます。なぜそれが間違っているのですか?なぜこれが良い?クラスのセッターを設定する前に、コンテンツの値が1回だけ必要です。その後、私はこのデータは必要ありません。この場合、私は必要とする値を上書きしています。 –

+0

"photphilous"というテキストノードがパーサによって3つのセクション "phot"、 "ophi"、 "lous"に分割されている場合、現在のコードは最後のセグメントのみをキャプチャし、値が "lous" 。これは頻繁に起こるわけではないので、ほとんどのテストではうまく表示されない可能性があるため、コードでは特に厄介なバグです。 –

+0

greateの例です。ありがとうございました –

関連する問題