修改一个 InputStream 并将其转换为 Outputstream
Modify an InputStream and convert it to Outputstream
我正在开发一个程序,我接收一个 XML 文件作为 InputStream。我必须进行一些更改,然后 return 它作为 OutputStream。
这是我的代码:
public void execute (InputStream xmlEntrada, OutputStream xmlSalida) {
SAXBuilder saxBuilder = new SAXBuilder();
Document document;
String idDocCobro, idCobro;
String sociedad, ejercicio, numDocCobro;
try {
document = saxBuilder.build(xmlEntrada);
Element raiz = document.getRootElement();
List piDocCobros = raiz.getChildren("Pagos");
for (int i = 0; i < piDocCobros.size(); i++) {
Element nodePiDocCobros = (Element) piDocCobros.get(i);
sociedad = nodePiDocCobros.getChildText("Sociedad");
ejercicio = nodePiDocCobros.getChildText("Ejercicio");
numDocCobro = nodePiDocCobros.getChildText("NumDocumentoCobro");
idDocCobro = sociedad + ejercicio + numDocCobro + System.currentTimeMillis();
nodePiDocCobros.getChild("iddoccobro").setText(idDocCobro);
List piCobros = nodePiDocCobros.getChildren("Pago");
for (int y = 0; y < piCobros.size(); y++) {
Element nodePiCobros = (Element) piCobros.get(y);
nodePiCobros.getChild("iddoccobro").setText(idDocCobro);
idCobro = numDocCobro + System.currentTimeMillis();
nodePiCobros.getChild("idcobro").setText(idCobro);
List piDocumentosRel = nodePiCobros.getChild("DocumentosRelacionados").getChildren("DocumentoRelacionado");
for (int z = 0; z < piDocumentosRel.size(); z++) {
Element nodePiDocumentosRel = (Element) piDocumentosRel.get(z);
nodePiDocumentosRel.getChild("idcobro").setText(idCobro);
}
}
}
copy(xmlEntrada, xmlSalida);
} catch (JDOMException | IOException e) {
System.out.println(e.toString());
}
}
public static void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
while (true) {
int bytesRead = in.read(buffer);
if (bytesRead == -1){
break;
}
out.write(buffer, 0, bytesRead);
}
}
我的问题是当我尝试读取函数 copy
中的 XML 时,因为流已经关闭,所以我得到一个异常。当我在程序开头使用 saxBuilder.build
语句时,流会自行关闭。我无法将之前的文本保存在 byte[]
变量中,因为我将在程序中修改它。
有什么想法吗?
在此先感谢您! :)
您读取的 InputStream 不是包含您所做修改的对象。您的修改在 Document 对象中。
这就是您需要发送到 OutputStream 的内容。
正如你们中的一些人告诉我的那样,我犯了一个愚蠢的错误。我必须做的是将文档传递给 OutputStream。我用下一段代码做到了这一点:
XMLOutputter xmlcode = new XMLOutputter();
xmlcode.output(document, xmlSalida);
感谢大家的帮助!
我正在开发一个程序,我接收一个 XML 文件作为 InputStream。我必须进行一些更改,然后 return 它作为 OutputStream。
这是我的代码:
public void execute (InputStream xmlEntrada, OutputStream xmlSalida) {
SAXBuilder saxBuilder = new SAXBuilder();
Document document;
String idDocCobro, idCobro;
String sociedad, ejercicio, numDocCobro;
try {
document = saxBuilder.build(xmlEntrada);
Element raiz = document.getRootElement();
List piDocCobros = raiz.getChildren("Pagos");
for (int i = 0; i < piDocCobros.size(); i++) {
Element nodePiDocCobros = (Element) piDocCobros.get(i);
sociedad = nodePiDocCobros.getChildText("Sociedad");
ejercicio = nodePiDocCobros.getChildText("Ejercicio");
numDocCobro = nodePiDocCobros.getChildText("NumDocumentoCobro");
idDocCobro = sociedad + ejercicio + numDocCobro + System.currentTimeMillis();
nodePiDocCobros.getChild("iddoccobro").setText(idDocCobro);
List piCobros = nodePiDocCobros.getChildren("Pago");
for (int y = 0; y < piCobros.size(); y++) {
Element nodePiCobros = (Element) piCobros.get(y);
nodePiCobros.getChild("iddoccobro").setText(idDocCobro);
idCobro = numDocCobro + System.currentTimeMillis();
nodePiCobros.getChild("idcobro").setText(idCobro);
List piDocumentosRel = nodePiCobros.getChild("DocumentosRelacionados").getChildren("DocumentoRelacionado");
for (int z = 0; z < piDocumentosRel.size(); z++) {
Element nodePiDocumentosRel = (Element) piDocumentosRel.get(z);
nodePiDocumentosRel.getChild("idcobro").setText(idCobro);
}
}
}
copy(xmlEntrada, xmlSalida);
} catch (JDOMException | IOException e) {
System.out.println(e.toString());
}
}
public static void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
while (true) {
int bytesRead = in.read(buffer);
if (bytesRead == -1){
break;
}
out.write(buffer, 0, bytesRead);
}
}
我的问题是当我尝试读取函数 copy
中的 XML 时,因为流已经关闭,所以我得到一个异常。当我在程序开头使用 saxBuilder.build
语句时,流会自行关闭。我无法将之前的文本保存在 byte[]
变量中,因为我将在程序中修改它。
有什么想法吗?
在此先感谢您! :)
您读取的 InputStream 不是包含您所做修改的对象。您的修改在 Document 对象中。
这就是您需要发送到 OutputStream 的内容。
正如你们中的一些人告诉我的那样,我犯了一个愚蠢的错误。我必须做的是将文档传递给 OutputStream。我用下一段代码做到了这一点:
XMLOutputter xmlcode = new XMLOutputter();
xmlcode.output(document, xmlSalida);
感谢大家的帮助!