2013-11-25 46 views
-1

我想保存/寫入XML時,我不能使用JDOM保存/寫入XML文件中的特殊字符。
當我試圖保存這種類型的角色,它給了我??而不是角色。
我在這個問題上搜索,但我不能得到正確的anwser,所以請幫助我。
在我的代碼中,我首先讀取xml,然後保存/寫入該xml幾乎沒有變化。 這是我寫的XML的cide。如何在XML中保存/寫入特殊字符?

try { 
      String path="D://test//N2019_set1.xml"; 
      File structureXml = new File(path); 
      SAXBuilder saxb = new SAXBuilder(); 
      Document document = saxb.build(structureXml); 
      Element rootElement = document.getRootElement(); 
      XMLOutputter xmlOutput = new XMLOutputter(); 

      List qestList = rootElement.getChildren(); 
      for (int i = 0; i < qestList.size(); i++) { 
       Element quesList = (Element) qestList.get(i); 
       System.out.println(quesList.getAttributeValue("ans")); 
       //change ans field 
       quesList.setAttribute("ans", ""+i); 
       List qList = quesList.getChildren(); 
       for(int a=0;a< qList.size();a++){ 
        Element ques =(Element) qList.get(a); 
        if(ques.getAttributeValue("file")!=null){ 
         //read xml 
         System.out.println(ques.getAttributeValue("file")); 
         //write xml attribute 
         System.out.println(ques.setAttribute("file","dasd"+a)); 
        } 
        if(ques.getName().equalsIgnoreCase("question")){ 
         //read 
         System.out.println(ques.getTextTrim()); 
         ques.removeContent(); 
         ques.addContent(new CDATA("question"+a)); 
        } 
        if (ques.getName().equalsIgnoreCase("options")) { 
         List optList = ques.getChildren(); 
         for (int k = 0; k < optList.size(); k++) { 
          Element option = (Element) optList.get(k); 
          if(option.getAttributeValue("file")!=null){ 
           System.out.println(option.getAttributeValue("file")); 
           //write xml attribute 
           System.out.println(option.setAttribute("file","sadas"+k)); 
          } 
          if(option.getName().equalsIgnoreCase("option")){ 
           //read 
           System.out.println(option.getTextTrim()); 
           option.removeContent(); 
           option.addContent(new CDATA("option"+k)); 
          } 
         } 
        } 
        if(ques.getName().equalsIgnoreCase("explaination")){ 
         //read 
         System.out.println(ques.getTextTrim()); 
         ques.removeContent(); 
         ques.addContent(new CDATA("explaination"+a)); 
        } 
       } 
       }   
       xmlOutput.output(document, new FileWriter(path)); 
//    System.out.println(xmlOutput.outputString(document)); 
     }catch (JDOMException ex) { 
      ex.printStackTrace(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 

這是我的xml文件

<?xml version="1.0" encoding ="utf-8" ?> 
<mcss> 
    <quest ans="1"> 
     <question><![CDATA[Write 5x= 3y-1 as linear equation form.]]></question> 
     <options> 
      <option><![CDATA[5x-3y+1=0]]></option> 
      <option><![CDATA[-5x-3y-1=0]]></option> 
      <option><![CDATA[5x+3y+1=0]]></option>   
     </options> 
     <explaination><![CDATA[Recall the linear equation in two variables form.]]></explaination> 
    </quest> 
</mcss> 
+1

你爲什麼要使用CDATA?這裏的「特殊字符」是什麼?你的代碼沒有提到它... –

+0

謝謝你的回覆..≠這種類型的字符,如果你要寫這個然後保存它看起來像?標記。 – vijayk

回答

3

你的問題還不清楚,但我嫌疑這可能是問題 - 它至少一個問題:

xmlOutput.output(document, new FileWriter(path)); 

FileWriter總是使用平臺默認編碼,而您的XML文檔聲稱使用UTF-8編碼。改爲使用FileOutputStream,將其傳遞給output方法...讓XMLOutputter本身處理編碼。

此外,目前尚不清楚爲什麼你使用所有這些CDATA部分 - 只是文本應該沒問題。

+0

謝謝它的作品。而CDATA是我XML中的要求。 – vijayk

+0

@vijayk:*爲什麼*你必須在你的XML中使用CDATA?這聽起來像是一個破碎的要求 - 非CDATA版本應該在語義上相同。 –

+0

通過使用這個xml我們啓動播放器。要在播放器中打開xml和xml的所有內容,它需要CDATA。 – vijayk