2016-11-09 101 views
-1

那麼當我寫它顯示奇怪的字符時,我一直在閱讀和我必須使用FileOutputStream來解決問題,但我很新,我不知道該怎麼做。我的代碼是錯誤的,有一個錯誤,build(xml),我不知道我是否會以這種方式編寫輸出文件。Java xml錯誤編碼utf-8

<?xml version="1.0" encoding="UTF-8"?> 
<prueba> 
    <reg id="576340"> 
      <dato cant="680" id="1" val="-1" num="" desc="résd" /> 
      <dato cant="684" id="5" val="-1" num="" desc="да и вообще" /> 
      <dato cant="1621" id="1" val="-1" num="" desc="Hi" /> 
      <dato cant="1625" id="5" val="-1" num="" desc="Hola" /> 
    </reg> 
</prueba> 


public static void main(String[] args) throws FileNotFoundException, 
    JDOMException, IOException { 

SAXBuilder builder = new SAXBuilder(); 
File xml = new File("c:\\prueba3.xml"); 
Writer out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(xml), "UTF8")); 
Document doc = (Document) new SAXBuilder().build(xml); 
Element raiz = doc.getRootElement(); 
List articleRow = raiz.getChildren("reg"); 

for (int i = 0; i < articleRow.size(); i++) { 

    Element row = (Element) articleRow.get(i); 
    List images = row.getChildren("dato"); 

    for (int j = 0; j < images.size(); j++) { 

     Element row2 = (Element) images.get(j); 
     String texto = row2.getAttributeValue("desc") ; 
     String id = row2.getAttributeValue("id"); 

     if ((texto != null) && (texto !="") && 
      (id.equals("1") || id.equals("2"))){     

     //row2.getChild("desc").setText("valor"); 
     out.append(row2.getAttribute("desc").setValue. 
        ("raúl").toString()); 
     } 
    } 
} 
out.flush(); 
out.close(); 
System.out.println("fin de programa"); 
} 

這些輸出數據

<?xml version="1.0" encoding="UTF-8"?> 
<prueba> 
    <reg id="576340"> 
      <dato cant="680" id="1" val="-1" num="" desc="ra/> 
      <dato cant="684" id="5" val="-1" num="" desc="..?? ? ??????/> 
      <dato cant="1621" id="1" val="-1" num="" desc="ra/> 
      <dato cant="1625" id="5" val="-1" num="" desc="Hola" /> 
    </reg> 
    </prueba> 

日誌錯誤

Exception in thread "main" org.jdom.input.JDOMParseException: Error on line 1 of document file:/c:/prueba3.xml: Final de archivo prematuro. 
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:530) 
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:905) 
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:884) 
at Prueba.main(Prueba.java:27)Caused by: org.xml.sax.SAXParseException; systemId: file:/c:/prueba3.xml; lineNumber: 1; columnNumber: 1; Final de archivo prematuro. 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.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 org.jdom.input.SAXBuilder.build(SAXBuilder.java:518) 
... 3 moreCaused by: org.xml.sax.SAXParseException; systemId: file:/c:/prueba3.xml; lineNumber: 1; columnNumber: 1; Final de archivo prematuro. 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) 
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.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 org.jdom.input.SAXBuilder.build(SAXBuilder.java:518) 
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:905) 
at org.jdom.input.SAXBuilder.build(SAXBuilder.java:884) 
at Prueba.main(Prueba.java:27) 

我會感謝你的幫助。

+0

後請 –

+0

完成了文件的內容,顯示的字符,輸出XML。 –

+0

嘿...你需要使用JDom嗎?或者我們可以使用無lib解決方案? –

回答

0

根據目標的編碼你必須決定如何將這些文件寫入文件系統。你決定寫'UTF8'。

Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(xml), "UTF8"));

你必須確保它加載了最新的程序知道它是在UTF-8編碼。例如。記事本++允許選擇與系統默認不同的編碼。在大多數情況下,UTF-8不是系統默認的。所以你必須在加載文件時提供信息。

也請您查看Java FileReader encoding issue

+0

嗨,是的,這是我的想法,但我不知道該怎麼做,我想用UTF 8編碼,我在文章中編寫的代碼在執行Document doc =(Document)new SAXBuilder()時給出錯誤。生成(xml),說格式不正確。問候。 –

+0

您是否嘗試使用「UTF-8」而不是「UTF8」?或者你可以提供一個堆棧跟蹤。 –

+0

線程「main」中的異常org.jdom.input.JDOMParseException:文檔文件第1行出錯:/ c:/prueba3.xml:Final de archivo prematuro。 \t在org.jdom.input.SAXBuilder.build(SAXBuilder.java:530) \t在org.jdom.input.SAXBuilder.build(SAXBuilder.java:905) \t在org.jdom.input.SAXBuilder.build (SAXBuilder.java:884) \t at Prueba.main(Prueba.java:27) 原因:org.xml.sax.SAXParseException; systemId:file:/ c:/prueba3.xml; lineNumber:1; columnNumber:1; Final de archivo prematuro。 \t at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) –

1

與此內容例如文件:

<?xml version="1.0" encoding="UTF-8"?> 
<prueba> 
    <reg id="123456"> 
      <dato cantidad="680" id="1" val="-1" num="" desc="résd" /> 
      <dato cantidad="684" id="5" val="-1" num="" desc="да и вообще" /> 
      <dato cantidad="1621" id="1" val="-1" num="" desc="Hi" /> 
      <dato cantidad="1625" id="5" val="-1" num="" desc="Hola" /> 
    </reg> 
</prueba> 

可以使用DOM本地Java

實施例進行解析:

public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException { 
    final File fXmlFile = new File("./Details2.xml"); 
    final DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
    final DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
    final Document document = dBuilder.parse(fXmlFile); 
    document.getDocumentElement().normalize(); 
    final NodeList regNodeList = document.getElementsByTagName("reg"); 
    for (int counter = 0; counter < regNodeList.getLength(); counter++) { 
     final Node nNode = regNodeList.item(counter); 
     System.out.println("Current Element :" + nNode.getNodeName()); 
     System.out.println("regs id : " + ((Element) nNode).getAttribute("id")); 
     final NodeList nList2 = ((Element) nNode).getElementsByTagName("dato"); 

     for (int counterChilds = 0; counterChilds < nList2.getLength(); counterChilds++) { 
     final Node nNode2 = nList2.item(counterChilds); 
     if (nNode2.getNodeType() == Node.ELEMENT_NODE) { 
      final Element eElement = (Element) nNode2; 
      System.out.println(String.format("Cantidad %s,id %s,val %s,num %s,Desc %s", 
      eElement.getAttribute("cantidad"), eElement.getAttribute("id"), 
      eElement.getAttribute("val"), eElement.getAttribute("num"), eElement.getAttribute("desc"))); 
    } 
    } 
} 
} 
+0

非常感謝,我有些疑惑,現在要修改屬性的值,eElement.getAttribute(「desc」)。 SetValue(「raúl」)不存在,爲了節省我應該怎麼做?我從來沒有使用節點,這是我的退出 Amount,id 1,val -1,num,Descrésd Amount,id 5,val - 1,num,Desc .. ?? ? ?????? ? ?????????? ? ???? 金額,id 1,val -1,num,描述hi 金額,id 5,val -1,數字,描述你好 –

+0

嗨,俄文字符不好編碼,你是俄文麼? 。 問候。 –

+0

*僅供參考:*此問題[與編碼無關](http://stackoverflow.com/questions/40512622/java-xml-error-encoding-utf-8#comment68275392_40512622)。 – Andreas