簡體   English   中英

Java XML錯誤編碼UTF-8

[英]Java xml error encoding utf-8

好吧,當我寫它顯示奇怪的字符時,我一直在閱讀,我必須使用FileOutputStream解決問題,但是我很新,不知道該怎么做。 我的代碼錯誤,執行構建(xml)時出錯,並且我不知道是否以這種方式寫入輸出文件。

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

多謝您的協助。

根據目標編碼,您必須決定如何將其寫入文件系統。 您決定用'UTF8'書寫。

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

您必須確保加載日期的程序知道它是以UTF-8編碼的。 例如notepad ++允許選擇與系統默認值不同的編碼。 在大多數情況下,UTF-8不是系統默認值。 因此,您必須在文件加載期間提供信息。

另請檢查Java FileReader編碼問題

具有以下內容的示例文件:

 <?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")));
    }
    }
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM