2016-11-09 9 views
-1

Nun, wenn ich schreibe es seltsame Zeichen zeigt, habe ich gelesen und ich muss FileOutputStream verwenden, um das Problem zu lösen, aber ich bin sehr neu und ich weiß nicht, wie es geht. Mein Code ist falsch, es liegt ein Fehler vor, build (xml) und ich weiß nicht, ob ich die Ausgabedatei auf diese Weise schreiben würde.Java XML Fehler Codierung 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"); 
} 

Dies sind die Ausgangsdaten

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

Protokollfehler

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) 

würde ich Ihre Hilfe zu schätzen wissen.

+0

den Inhalt der Datei schreiben pls –

+0

Geschehen, zeigt Zeichen, die Ausgabe xml. –

+0

hey ... brauchst du JDom ??? oder können wir eine No-Lib-Lösung verwenden? –

Antwort

0

des Ziel Je kodieren Sie müssen Entscheiden Sie, wie dies in das Dateisystem geschrieben wird. Sie haben sich entschieden, mit 'UTF8' zu schreiben.

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

Sie müssen sicherstellen, dass das Programm, das das Datum lädt weiß, dass es in UTF-8 kodiert ist. Z.B. Notepad ++ ermöglicht die Auswahl einer anderen Kodierung als der Systemstandard. In den meisten Fällen ist UTF-8 kein Systemstandard. Sie müssen also die Informationen beim Laden der Dateien angeben.

Bitte überprüfen Sie auch Java FileReader encoding issue

+0

Hallo, Ja, das ist meine Idee, aber ich weiß nicht, wie es geht, ich möchte in UTF 8 kodieren, der Code, den ich in der Post geschrieben habe, gibt einen Fehler beim Ausführen von Document doc = (Document) new SAXBuilder(). Build (xml), sagt, dass das Format nicht korrekt ist. Schöne Grüße. –

+0

Haben Sie versucht, "UTF-8" anstelle von "UTF8" zu verwenden? Oder können Sie einen Stacktrace bereitstellen? –

+0

Ausnahme im Thread "Haupt" org.jdom.input.JDOMParseException: Fehler in Zeile 1 der Dokumentdatei:/c: /prueba3.xml: Final de archivo prematuro. \t bei org.jdom.input.SAXBuilder.build (SAXBuilder.java:530) \t bei org.jdom.input.SAXBuilder.build (SAXBuilder.java:905) \t bei org.jdom.input.SAXBuilder.build (SAXBuilder.java:884) \t bei Prueba.main (Prueba.java:27) verursacht durch: org.xml.sax.SAXParseException; systemId: Datei:/c: /prueba3.xml; Zeilennummer: 1; Spaltennummer: 1; Letztes Archiv Prematuro. \t bei com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException (unbekannte Quelle) –

1

Eine Beispieldatei mit folgendem Inhalt:

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

kann mit DOM nativen Java analysiert werden

Beispiel:

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

Vielen Dank, ich habe einige Zweifel, jetzt, um Werte zu den Attributen zu ändern?, EElement.getAttribute ("desc"). SetValue ("raúl") existiert nicht, um zu speichern, was soll ich tun?, Ich habe noch nie Knoten verwendet, das ist mein Ausgang Betrag, ID 1, Wert -1, Zahl, Desc résd Betrag, ID 5, Wert - 1, num, Desc .. ?? ? ?????? ? ?????????? ? ???? Betrag, ID 1, Wert -1, Zahl, Beschreibung Hallo Betrag, ID 5, Wert -1, Zahl, Beschreibung Hello –

+0

Hallo, codiert nicht russische Zeichen gut, bist du Russisch?, Verwenden Sie möglicherweise Ihre lokale Codierung . Grüße. –

+0

* FYI: * Diese Frage hat [nichts mit Codierung zu tun] (http://stackoverflow.com/questions/40512622/java-xml-error-encoding-utf-8#comment68275392_40512622). – Andreas