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