好的,所以我一直在看Ephesoft开发人员指南中的示例代码...
//import java.io.File;
//
//import javax.xml.transform.Result;
//import javax.xml.transform.Source;
//import javax.xml.transform.Transformer;
//import javax.xml.transform.TransformerConfigurationException;
//import javax.xml.transform.TransformerException;
//import javax.xml.transform.TransformerFactory;
//import javax.xml.transform.TransformerFactoryConfigurationError;
//import javax.xml.transform.dom.DOMSource;
//import javax.xml.transform.stream.StreamResult;
//
//import org.w3c.dom.Document;
//import org.w3c.dom.Element;
//import org.w3c.dom.Node;
//import org.w3c.dom.NodeList;
import com.ephesoft.dcma.script.IScripts;
//--------------------------------------
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
//import com.ephesoft.dcma.script.IJDomScript;
/**
* The <code>ScriptDocumentAssembler</code> class represents the script execute structure. Writer of scripts plug-in should implement this IScript
* interface to execute it from the scripting plug-in. Via implementing this interface writer can change its java file at run time.
* Before the actual call of the java Scripting plug-in will compile the java and run the new class file.
*
* @author Ephesoft
* @version 1.0
*/
public class ScriptDocumentAssembler
{
private static final String BATCH_LOCAL_PATH = "BatchLocalPath";
private static final String BATCH_INSTANCE_ID = "BatchInstanceIdentifier";
private static final String EXT_BATCH_XML_FILE = "_batch.xml";
private static final String DOCUMENTS = "Documents";
private static final String DOCUMENT = "Document";
private static final String PAGES = "Pages";
private static final String PAGE = "Page";
private static String ZIP_FILE_EXT = ".zip";
/**
* The <code>execute</code> method will execute the script written by the writer at run time with new compilation of java file. It
* will execute the java file dynamically after new compilation.
*
* @param document {@link Document}
*/
public void execute(Document document, String fieldName, String docIdentifier) {
System.out.println("************* Inside ScriptDocumentAssembler scripts.");
System.out.println("************* Start execution of the ScriptDocumentAssembler scripts.");
System.out.println("Custom ScriptDocumentAssembler, removing Document seperator sheets...");
removeFirstPageOfDoc(document);
boolean isWrite = true;
//boolean isWrite = false;
// write the document object to the XML file.
if (isWrite) {
writeToXML(document);
System.out.println("************* Successfully write the xml file for the ScriptDocumentAssembler scripts.");
} else {
System.out.println("************** No changes performed by ScriptDocumentAssembler scripts.");
}
System.out.println("************* End execution of the ScriptDocumentAssembler scripts.");
}
private void removeFirstPageOfDoc(Document documentFile) {
Element documentsList = (Element) documentFile.getChildren(DOCUMENTS).get(0);
List<?> documentList = documentsList.getChildren(DOCUMENT);
for (int documentIndex = 0; documentIndex < documentList.size(); documentIndex++) {
Element document = (Element) documentList.get(documentIndex);
System.out.println("Processing Document - " + document.getChildren("Identifier").get(0).getText());
Element pages = (Element) document.getChildren(PAGES).get(0);
List<?> pageList = pages.getChildren(PAGE);
Element page = (Element)pageList.get(0);
System.out.println(document.getChildren("Identifier").get(0).getText() + " Page Count = " + pageList.size());
System.out.println("Removing page node " + page.getChildren("Identifier").get(0).getText() + " from " +
document.getChildren("Identifier").get(0).getText());
pages.remove(page);
System.out.println(document.getChildren("Identifier").get(0).getText() + " Page Count = " + pageList.size());
}
}
private void writeToXML(Document document) {
String batchLocalPath = null;
List<?> batchLocalPathList = document.getRootElement().getChildren(BATCH_LOCAL_PATH);
if (null != batchLocalPathList) {
batchLocalPath = ((Element) batchLocalPathList.get(0)).getText();
}
if (null == batchLocalPath) {
System.err.println("Unable to find the local folder path in batch xml file.");
return;
}
String batchInstanceID = null;
List<?> batchInstanceIDList = document.getRootElement().getChildren(BATCH_INSTANCE_ID);
if (null != batchInstanceIDList) {
batchInstanceID = ((Element) batchInstanceIDList.get(0)).getText();
}
if (null == batchInstanceID) {
System.err.println("Unable to find the batch instance ID in batch xml file.");
return;
}
String batchXMLPath = batchLocalPath.trim() + File.separator + batchInstanceID + File.separator + batchInstanceID
+ EXT_BATCH_XML_FILE;
String batchXMLZipPath = batchXMLPath + ZIP_FILE_EXT;
System.out.println("batchXMLZipPath************" + batchXMLZipPath);
OutputStream outputStream = null;
File zipFile = new File(batchXMLZipPath);
FileWriter writer = null;
XMLOutputter out = new XMLOutputter();
try {
if (zipFile.exists()) {
System.out.println("Found the batch xml zip file.");
outputStream = getOutputStreamFromZip(batchXMLPath, batchInstanceID + EXT_BATCH_XML_FILE);
out.output(document, outputStream);
} else {
writer = new java.io.FileWriter(batchXMLPath);
out.output(document, writer);
writer.flush();
writer.close();
}
} catch (Exception e) {
System.err.println(e.getMessage());
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
}
}
}
}
public static OutputStream getOutputStreamFromZip(final String zipName, final String fileName) throws FileNotFoundException, IOException {
ZipOutputStream stream = null;
stream = new ZipOutputStream(new FileOutputStream(new File(zipName + ZIP_FILE_EXT)));
ZipEntry zipEntry = new ZipEntry(fileName);
stream.putNextEntry(zipEntry);
return stream;
}
}
注意我没有更改原始代码中的任何内容,但我将jdom和ephesoft jar添加到我的构建路径中。但是,在removeFirstPageOfDoc方法中,我仍然得到一堆与转换相关的错误。例如,行Element documentsList = (Element) documentFile.getChildren(DOCUMENTS).get(0);
应该允许documentFile访问Element的方法,对吧?但是,它似乎仍然只能访问类型文档的方法。我只是想知道这里可能出现的问题以及如何解决它?
答案 0 :(得分:3)
例如,行
Element documentsList = (Element) documentFile.getChildren(DOCUMENTS).get(0);
应该允许documentFile访问Element的方法,对吗?
不,因为投射的优先级低于点运算符。要将documentFile
转换为Element
类型,您可以写下:
Element documentsList = ((Element) documentFile).getChildren(DOCUMENTS).get(0);
围绕(Element) documentFile
的括号。
已编辑添加 (包含以下评论中的信息):
然而,根据the Javadoc for org.jdom.Document
和that for org.jdom.Element
,它们都是实际的类 - 两者都不是接口 - 并且它们都不是另一个的子类型。这意味着你实际上不能从一个投射到另一个。 (在Java中,强制转换不允许您将一种类型的实例转换为另一种类型;为了((Type) reference)
能够工作,reference
必须引用一个真正属于类型{的对象{1}}。由于对象永远不能是Type
和Element
的实例,因此编译器甚至不允许这种类型的转换。)
相反,编写此示例代码的人可能应该写下这个:
Document
使用Element documentsList =
documentFile.getRootElement().getChildren(DOCUMENTS).get(0);
方法(返回文档的根元素)而不是强制转换为getRootElement()
(这会试图说服编译器文件只是 一个元素)。