1

I have a trivial Java question. I have a function that is supposed to generate a XML file. At the moment I simply have a String return type for the function.

public String myXmlFile()

I like this approach because it gives me a clean api.

I do not like this approach because it puts me in a sticky spot if the xml becomes too large. I know I could create a file and return a handler of the file from the function. However, creating a file gives me the added headache of having to remember to delete this file once I am done with it. And that is not a very easy thing, because the code that uses the XML is not very trivial. It is complex and it is going to change a lot.

So, polling the group to see if there is a easy answer to this?

4

6 回答 6

3

您可以通过将流编写器作为输入参数来回避这个问题,这将允许用户(调用您的 API 的应用程序)决定数据是否足够小以适合内存,或者 XML 是否太大以至于需要进入一个文件。例如:

public void myXmlFile(OutputStream output);

这使您的 API 保持简单,并允许您处理这两种情况。

于 2013-07-01T10:23:42.667 回答
0

Java 对处理内置的 XML 有广泛的支持,为什么要重新发明轮子呢?
创建一个 DOM,使用 javax.xml.transform 包中的功能将其转换为 StreamResult,并将 Stream 通过管道传输到文件。
在最基本的情况下,您会得到以下内容:

    DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = df.newDocumentBuilder();
    Document doc = documentBuilder.newDocument();
    Element root = doc.createElement("RootElement");
    doc.appendChild(root);
    Element child = doc.createElement("ChildElement");
    child.setNodeValue("Hello World");
    root.appendChild(child);

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    File f = new File("c:\\temp\\dummy.xml");
    StreamResult resultStream = new StreamResult(f);
    transformer.transform(new DOMSource(doc), resultStream);
于 2013-07-01T11:02:44.093 回答
0

您的方法可能需要一个 OutputStream 参数,然后您可以按字节编写 xml 并在完成后关闭。

于 2013-07-01T10:25:25.197 回答
0

只要有两种方法。然后 API 的最终用户可以决定使用哪种方法:

public String myXmlFileAsString();
public File myXmlFile();
于 2013-07-01T10:25:47.520 回答
0

一种想法是使用缓存解决方案(它可以决定是将数据存储在内存中还是磁盘上)并在您的 api 中传递缓存键而不是 XML 内容。

通过这种方式,您可以配置例如要使用的最大内存,并将其余的留给库。

有关可能性列表,请参见此处

于 2013-07-01T10:25:52.503 回答
0

我不是 Java 中的 XML 处理方面的专家,但为什么不调查 Xerces 是否有必要的优化,而将优化和处理文件的工作留给 Xerces。然后,您可以从您的方法中返回一个 Xerces XMLString。 http://xerces.apache.org/xerces2-j/javadocs/xni/org/apache/xerces/xni/XMLString.html

Xerces 有一些优化,例如,XMLString 只是保存在扫描仪字符缓冲区中的字符串子字符串的 XML 表示。但要小心,因为这种模式(只保留边界而不将子字符串复制到单独的字符串中)有时会导致内存泄漏。(参见 Java7u21 中 String 的变化。)

于 2013-07-01T10:36:09.130 回答