0

好的,所以我一直在查看 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 的方法,对吗?但是,它似乎仍然只能访问文档类型的方法。我只是想知道这里可能存在什么问题以及如何解决它?

4

2 回答 2

3

例如,该行Element documentsList = (Element) documentFile.getChildren(DOCUMENTS).get(0);应该允许 documentFile 访问 Element 的方法,对吗?

不,因为转换的优先级低于点运算符。要documentFile转换为 type Element,你可以这样写:

Element documentsList = ((Element) documentFile).getChildren(DOCUMENTS).get(0);

用括号括起来(Element) documentFile

编辑添加 (合并以下评论中的信息)

但是,根据for和for的 Javadocorg.jdom.Document,它们都是实际的类——它们都不是接口——也不是另一个的子类型。这意味着您实际上不能从一个转换到另一个。(在 Java 中,强制转换不允许您将一种类型的实例转换为另一种类型;为了工作,必须引用一个真正属于 type的对象。因为一个对象永远不可能是两者的实例并且,编译器甚至不允许在这里进行这种类型的转换。)org.jdom.Element((Type) reference)referenceTypeElementDocument

相反,编写此示例代码的人可能应该这样写:

Element documentsList =
    documentFile.getRootElement().getChildren(DOCUMENTS).get(0);

它使用getRootElement()方法(返回文档的根元素)而不是强制转换Element(试图让编译器相信文档只是一个元素)。

于 2012-09-18T17:15:25.277 回答
1

ruakh 是对的,但你也需要做下一个级别。

Element documentsList = (Element)(((Document) documentFile).getChildren(DOCUMENTS).get(0));

当然,在 JDOM 2.x(具有正确的泛型类型)中,这一切都变得更容易了......

Element documentsList = doumentFile.getChildren(DOCUMENTS).get(0);

滚滚

于 2012-09-18T17:47:01.877 回答