2016-04-15 9 views
0

Ich habe seit mehr als einer Woche für dieses Problem gekämpft. Ich lese wahrscheinlich mehr als 50 verschiedene Seiten darüber, aber ich kann die Lösung in meinem Fall nicht finden.Inhalt ist in Prolog nicht erlaubt - Ausnahme passiert in Unix, aber nicht in Windows mit demselben Code

Natürlich würde meine Frage als Duplikat erscheinen, wenn es nicht einen bestimmten Punkt gibt: Mein Code funktioniert in Windows und der gleiche Code, während in Unix läuft, verursacht das Problem zu diesem Thema.

Grundsätzlich führten alle Suchen in Foren dazu, dass ich verstand, dass es eine Frage der Stückliste ist. Ich habe alle Vorschläge befolgt und mein Code funktioniert in Windows, aber es verursacht das gleiche Problem in Unix Mainframe.

Hier finden Sie die wichtigsten Schritte in meinem Code und kommentierte Targets, die ich ausprobiert habe. Es ist schwer, etwas anderes zu tun, da sich vorzustellen, da der Anfang meinen Code in Windows ausgeführt wird, aber was die Cotent Problem nur in Unix Mainframe

Erster Schritt:

Element txns = q.parseMHEFile(path to my file); 

DOMImplementationLS lsImpl = (DOMImplementationLS) txns.getOwnerDocument().getImplementation().getFeature("LS", "3.0"); 

LSSerializer serializer = lsImpl.createLSSerializer(); 
serializer.getDomConfig().setParameter("xml-declaration", false); 
String result = serializer.writeToString(txns); 

log.info(result); //I sse here same result both in Windows as in Unix 

Document d2 = convertStringToDocument(result); 
q.addMessages(d2.getDocumentElement()); 

Zweiter Schritt, eine Datei zu DOM-Objekt serialise : Es gibt einen sehr komplizierten Ablauf, der neue Felder ändert und hinzufügt. Am Ende mit dieser Methode in bestimmten temporärer Datei speichern:

synchronized protected void writeToFile(Node node, String file) 
throws SAXException, IOException { 

try { 

StringWriter output = new StringWriter(); 

Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.transform(new DOMSource(node), new StreamResult(output)); 

String xml = output.toString(); 

Integer whereIs = xml.indexOf("<?xml"); 

/*both in Windows as in Unix I will find <?xml in position 0, so no extra character before <?xml */ 
if (whereIs >= 0) { 
    log.info("<?xml is in " + whereIs + " position"); 
} 

FileWriter filewriter = new FileWriter(file); 

/* The replace below was a clue found in some forum for taking the BOM out in case it exists */ 
filewriter.write(((xml.replace("\uFEFF", "")).replace("\uFEFF", "")).replace("\uFFFE", "")); 
filewriter.close(); 

} catch (Exception ex) { 
    System.out.println(ex.getMessage()); 
} 
} 

Dritter Schritt: beim Parsen der temporäre Datei ich den Fehler. Im folgenden sehen Sie zwei Möglichkeiten, die ich versucht habe und beiden Läufe in WIndows aber nicht in Unix

// Version, bevor ich mehrere Foren zeigen die BOM Ausgabe

 public Node readFromFile(String file) throws ParserConfigurationException { 

DocumentBuilderFactory docFactory = DocumentBuilderFactory 
          .newInstance(); 
DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
Document d = null; 
try { 

d = docBuilder.parse(file); 

} catch (Exception e) { 
    System.out.println(e.getMessage()); 
} 
return d.getDocumentElement(); 
} 

// Version nach einigen Hinweisen gefunden in Foren gelesen im Zusammenhang mit BOM Ausgabe öffentlichen Knoten Readfromfile (String-Datei) {

try { 
java.io.File f = new java.io.File(file); 
java.io.InputStream inputStream = new java.io.FileInputStream(f); 

// Checking if there is BOM 
BOMInputStream bomIn = new BOMInputStream(inputStream,ByteOrderMark.UTF_8, ByteOrderMark.UTF_16LE, ByteOrderMark.UTF_16BE); 

//it always show that there is no BOM in both Windows as Unix 
if (bomIn.hasBOM() == false) { 
    log.info("No BOM found"); 
} 

java.io.Reader reader = new java.io.InputStreamReader(inputStream,"UTF-8"); 
InputSource is = new InputSource(reader); 
is.setEncoding("UTF-8"); 

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); 
Document d = null; 

log.info("Before parsing file"); //this is the last log while in Unix before the below error 

/*Next line will cause issue only in Unix 
ÝFatal Error¨ myFile.xml:1:39: Content is not allowed in prolog. 
Content is not allowed in prolog.*/ 

d = docBuilder.parse(is); 

log.info("After parsing file"); //this will be showed while in Windows 

return d.getDocumentElement(); 
} catch (Exception e) { 
    log.info(e.getMessage()); 
    return null; 
} 
} 

POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
     <modelVersion>4.0.0</modelVersion> 

     <groupId>com.mycomp.batchs</groupId> 
     <artifactId>AuthorizationFileToICTTQueue</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
     <packaging>jar</packaging> 

     <name>AuthorizationFileToICTTQueue</name> 
     <url>http://maven.apache.org</url> 

     <properties> 
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
       <spring.framework.version>4.2.4.RELEASE</spring.framework.version> 
       <spring.batch.version>3.0.6.RELEASE</spring.batch.version> 
       <log4j.version>1.2.7</log4j.version> 
       <java.version>1.7</java.version> 
       <maven.compiler.plugin.version>2.1</maven.compiler.plugin.version> 
       <hsqldb.version>1.8.0.10</hsqldb.version> 
       <logback-classic.version>1.1.5</logback-classic.version> 
     </properties> 

     <dependencies> 
       <dependency> 
        <groupId>commons-io</groupId> 
        <artifactId>commons-io</artifactId> 
        <version>2.4</version> 
       </dependency> 


       <dependency> 
        <groupId>org.springframework.batch</groupId> 
        <artifactId>spring-batch-core</artifactId> 
        <version>${spring.batch.version}</version> 
       </dependency> 
       <dependency> 
        <groupId>org.springframework.batch</groupId> 
        <artifactId>spring-batch-infrastructure</artifactId> 
        <version>${spring.batch.version}</version> 
       </dependency> 
       <dependency> 
        <groupId>ch.qos.logback</groupId> 
        <artifactId>logback-classic</artifactId> 
        <version>${logback-classic.version}</version> 
       </dependency> 

       <dependency> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-tx</artifactId> 
        <version>${spring.framework.version}</version> 
       </dependency> 

       <dependency> 
        <groupId>org.springframework</groupId> 
        <artifactId>spring-jdbc</artifactId> 
        <version>${spring.framework.version}</version> 
       </dependency> 
       <dependency> 
        <groupId>hsqldb</groupId> 
        <artifactId>hsqldb</artifactId> 
        <version>${hsqldb.version}</version> 
       </dependency> 

     </dependencies> 

     <build> 
       <plugins> 
        <plugin> 
          <groupId>org.apache.maven.plugins</groupId> 
          <artifactId>maven-compiler-plugin</artifactId> 
          <version>${maven.compiler.plugin.version}</version> 
          <configuration> 
            <source>${java.version}</source> 
            <target>${java.version}</target> 
          </configuration> 
        </plugin> 

       </plugins> 
     </build> 
</project> 

**** Bearbeitet in 18/Feb/2016 01: 00Pm Brasilia Zeitzone Übertragen von zOS/390 mit OpenText Connectivity - Connection Central für x64 Erstes Bild zeigt die Datei als ASCII übertragen. Zweites Bild zeigt die Datei als Binary übertragen

Transfer Mode = ASCII

Transfer Mode = Binary

+0

Können Sie die generierte Datei in einem Hex-Editor/Viewer überprüfen? Was sind die ersten 100 Bytes der Datei (in hex)? – Alohci

+0

Alohci, ich habe die ersten 100 Bytes aus der temporären Datei hinzugefügt. Der Fehler tritt auf, wenn man ihn schneidet. Ich kenne nur eine Möglichkeit, es zu untersuchen. Ich lade die Datei von Mainframe zu meinem lokalen Windows mit OpenText FTP-Funktion und dann öffne ich es in Hexeditor von mh-nexus. Weißt du, ob ich die Datei gerade in Unix öffnen soll, um dir die ersten 100Bytes zu zeigen? Ich frage mich, ob das Dateiformat geändert wird, während es von Mainframe auf meinen PC verschoben wird. Was genau muss ich mir die ersten 100 Bytes ansehen, um mir einen Hinweis zu geben, wie ich es beheben kann? Sie können in meinem Code sehen, dass ich Code, um Garante zu enthalten, habe ich nicht die Stücklisten-Zeichen –

+1

Es ist eine lange Zeit (~ 30 Jahre) seit ich Unix verwendet, aber ich denke, es gab einen Befehl "od -x Dateiname" Ich gebe Ihnen einen Hex-Dump einer Datei. Ich weiß auch nicht, wonach ich suchen soll, aber ich sehe keinen verdächtigen Inhalt im XML-Prolog von dem, was du gepostet hast, sorry. – Alohci

Antwort

1

wie ein Zeichensatz-Ausgabe-Sounds, könnte der XML-Prolog

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

sein und wenn Sie * nichts installieren, für Aus irgendeinem Grund unterstützt UTF nicht, dann wird die Datei nicht korrekt formatiert. Könnte es sein, dass du beim Erstellen/Kopieren des Dokuments in * nix den Zeichensatz vermasselt hast und nicht das erwartete UTF-8 ist? Es könnte sinnvoll sein, die Datei mit einem Hex-Editor auf beiden Plattformen zu untersuchen.

Ich weiß, dass ich schon einmal darauf gestoßen bin, obwohl normalerweise anders herum, aber ich habe kein aktuelles Beispiel, wo es nicht funktioniert, nur wissen, dass es ein Zeichensatzproblem war.

+0

Scott, wie kann ich herausfinden, ob "Unix installieren ... UTF nicht unterstützt"? Die temporäre Datei, die das Problem verursacht, wird tatsächlich nicht von einem anderen Host auf den Mainframe kopiert. Es wird von der eigenen Anwendung erstellt. Bitte beachten Sie die oben eingefügte temporäre Datei. –

+0

Künftige Leser könnten auch an diesem Thema interessiert sein: http://stackoverflow.com/questions/36732018/why-does-string-getbytes-work-different-according-the-operation-system –

+0

jede Distribution ist anders Ich bin in erster Linie eine FreeBSD-Person, ich weiß nichts über Linux (wovon ich denke, dass Sie sich auf Linux beziehen) –

Verwandte Themen