将XML资源存储为对象而不是文件

时间:2014-08-26 05:15:48

标签: java xml xpath

请将您的相位器转为“noob”。

作为我的Java Servlet的一部分,我调用REST资源并接受返回的文本文件,如下所示:

// check to see if the file really exists (i.e. a session is in
// progress) or we need to create one
// this should save constantly hitting the server for a new file for
// every transaction.

if (fXmlFile.exists()) {
} else {
    File collectionTree = new File(bscConnector.GetCollection());
    PrintWriter xmlfile = new PrintWriter(directoryName + "/outputString.xml");
    xmlfile.println(collectionTree);
    xmlfile.close();
}

从那里我运行搜索并替换它以使其成为有效的XML文件,以便我可以实际运行xpath查询:

SearchAndReplace sAndR = new SearchAndReplace();

// Swap the slashes so we can actually 
// query the freakin' document.
sAndR.readFiles(fXmlFile, "\\", "/");

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
Document doc = null;
    try {
        dBuilder = dbFactory.newDocumentBuilder();
        doc = dBuilder.parse(fXmlFile);
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // optional, but recommended
    // read this -
    // http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
    doc.getDocumentElement().normalize();

    // Create an instance of an xpath object    
    XPath xPath = XPathFactory.newInstance().newXPath();

然后我带着各种xpath查询进入城镇,创建接口yadda yadda。

我的问题是这个;虽然这种方法有效,但是在服务器上创建和查询实际文件而不是在会话对象中执行所有这些操作似乎非常奇怪,但我找不到正确的方法。我应该使用哪些对象/对象而不是这种序列化到磁盘和读取的方法?

感谢。

1 个答案:

答案 0 :(得分:0)

这个问题变得非常简单我正在考虑删除它只是为了防止污染堆栈溢出;这是对Java可以用String做什么的基本误解。我用以下内容替换了所有文件操作内容:

String fXmlFile = null;

if (fXmlFile != null) {} else {
    File collectionTree = new File(bscConnector.GetCollection());
    fXmlFile = collectionTree.toString();
    fXmlFile = fXmlFile.replace("\\", "/");
}

除此之外,我的代码保持不变。所有工作都快得多,因为它不再序列化和反序列化大文本文件。

我要将fXmlFile的初始化移出JSP并进入servlet,将其定义为会话对象,并将其作为请求的一部分传递,因为现在我必须声明它在我测试之前就为null,看它是否为空,这似乎是弄巧成拙。除此之外,一切都很好。

谢谢eldjon。