我正在編寫一個實用程序來使用STAX事件模型來更改XML文件中的文本實體。我發現源文檔中的一些空白區域沒有被複制到輸出中。我寫了這個示例程序:Stax事件閱讀器跳過空白
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import javax.xml.stream.*;
import javax.xml.stream.events.*;
public class EventCopy {
private static final String INPUT =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<foo><bar>baz</bar></foo>\n";
public static void main(String[] args) throws XMLStreamException, IOException {
InputStream reader = new ByteArrayInputStream(INPUT.getBytes(StandardCharsets.UTF_8));
OutputStream writer = new ByteArrayOutputStream();
XMLInputFactory input = XMLInputFactory.newInstance();
XMLEventReader xmlReader = input.createXMLEventReader(reader, "UTF-8");
try {
XMLOutputFactory output = XMLOutputFactory.newInstance();
XMLEventWriter xmlWriter = output.createXMLEventWriter(writer, "UTF-8");
try {
while (xmlReader.hasNext()) {
XMLEvent event = xmlReader.nextEvent();
System.out.print(event.getEventType() + ",");
xmlWriter.add(event);
}
} finally {
xmlWriter.close();
}
} finally {
xmlReader.close();
}
System.out.println("\n[" + writer.toString() + "]");
}
}
使用帶有甲骨文的Java 7的默認斯塔克斯實現,該電源輸出:
7,1,1,4,2,2,8,
[<?xml version="1.0" encoding="UTF-8"?><foo><bar>baz</bar></foo>]
的XML序言以下,並在輸入結束時的換行已經消失。看來讀者甚至不會爲他們產生事件。
我想,也許在XML閱讀器離開位於最後一個XML標籤的末尾輸入流,並試圖將代碼添加到尾隨字符從輸入複製到輸出:
...
} finally {
xmlReader.close();
}
int ii;
while (-1 != (ii = reader.read())) {
writer.write(ii);
}
但這沒有任何作用。
有沒有辦法讓STAX更忠實地複製這個XML?不同的STAX實現在這裏會有不同的表現嗎?
嘗試使用「
」而不是「\ n」 –