2013-07-01 4 views
0

У меня есть тривиальный вопрос Java. У меня есть функция, которая должна генерировать XML-файл. На данный момент у меня просто есть тип возврата String для функции.Функция Java для возврата XML.

public String myXmlFile() 

Мне нравится этот подход, потому что он дает мне чистую апи.

I не как этот подход, потому что он помещает меня в липкое пятно, если xml становится слишком большим. Я знаю, что могу создать файл и вернуть обработчик файла из этой функции. Тем не менее, создание файла дает мне дополнительную головную боль, когда вам нужно запомнить этот файл, как только я закончу его. И это не очень просто, потому что код, который использует XML, не очень тривиален. Это сложно, и он сильно изменится.

Итак, опрос группы, чтобы узнать, есть ли на это легкий ответ?

+0

ли вы получить какую-либо ошибку, делая это? – Ketan

+2

Не могли бы вы показать нам код, который вы пробовали до сих пор? –

ответ

2

Вы можете обойти эту проблему, взяв запись потока в качестве входного параметра, что позволило бы пользователям (приложению, вызывающим ваш API) решить, достаточно ли данных для размещения в памяти или если XML настолько велик, что нужно зайти в файл. Например:

public void myXmlFile(OutputStream output); 

Это упрощает ваш API и позволяет обрабатывать оба случая.

+0

Да. Это было бы одним из разумных вариантов. Тем не менее, если быть педантичным, я думаю - в этом случае возможно, что функция myXmlFile() вызывает внутри себя некоторую другую функцию (в другом потоке), и это увеличивает вероятность того, что клиент функции пытается прочитать выходной поток, а помощник/внутренняя функция все еще пишет на нем? – partha

+0

Ну, да, теоретически, но вам действительно нужно будет сходить с пути, чтобы создать эту ситуацию ... если вы не рассказали нам о сложной и очень умной многопоточной среде, в которой вы будете звонить такая функция. Это также было бы, по моему далеко не скромному мнению, серьезным злоупотреблением API, как вы его описали до сих пор. – Steve

+0

Согласен. У вас есть справедливая точка. Думаю, тогда это решение. Благодарю. :) – partha

0

Ваш метод может принимать параметр OutputStream, тогда вы можете написать xml по байтам и закрыть по завершении.

0

Просто у вас есть два метода. Конечный пользователь API может затем решить, какой метод использовать:

public String myXmlFileAsString(); 
public File myXmlFile(); 
0

Одна из идей будет использовать решение кэширования (который может решить, следует ли сохранять данные в памяти или на диске) и передать вокруг кэша вместо XML-контента в вашем api.

Таким образом вы можете настроить, например, максимальную память, которую хотите использовать, и оставить остальные в библиотеке.

См. here для получения списка возможностей.

0

Я не являюсь экспертом в обработке XML на Java, но почему бы не исследовать, нужна ли Xerces необходимая оптимизация и просто оставить оптимизацию и обработать файлы в Xerces. Затем вы можете просто вернуть XMLString Xerces из своего метода.

Xerces имеет некоторые оптимизации, например, XMLString представляет собой просто представление XML подстроки строки, хранящейся в символьном буфере сканера. Но будьте осторожны, потому что этот шаблон (просто удерживая границы без копирования подстроки в отдельную строку) может иногда вызывать утечку памяти. (См. Изменения в String в Java7u21.)

0

Java имеет обширную поддержку обработки XML-данных, зачем изобретать колесо?
Создайте DOM, используйте функциональные возможности пакета javax.xml.transform, чтобы преобразовать это в StreamResult и передать поток в файл.
По своей сути, вы получите что-то вроде следующего:

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); 
Смежные вопросы