Как канонизировать XML-объект Stax - PullRequest
1 голос
/ 05 мая 2010

Я хочу канонизировать объект Stax, программа работает с DOM, но dom не может управлять большими XML-документами (например, 1 ГБ), поэтому STAX - это решение.

Код, который у меня естьэто:

File file=new File("big-1gb.xml");

org.apache.xml.security.Init.init(); 
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder documentBuilder = dfactory.newDocumentBuilder();

Document doc = documentBuilder.parse(file);

Canonicalizer c14n = Canonicalizer.getInstance("http://www.w3.org/TR/2001/REC-xml-c14n-20010315");

outputBytes = c14n.canonicalizeSubtree(doc.getElementsByTagName("SomeTag").item(0));

Идея в том, чтобы сделать код ниже со Stax ...

Thx:)

1 Ответ

0 голосов
/ 07 мая 2010

Я решаю эту проблему с библиотекой XOM, вот эквивалентный код.

ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
ObjectOutputStream outputstream = new ObjectOutputStream(bytestream);

nu.xom.Builder builder = new nu.xom.Builder(false, new nu.xom.samples.MinimalNodeFactory()); //The false parameter is for avoid a ValidationException that trows XOM

try {
nu.xom.canonical.Canonicalizer outputter = new nu.xom.canonical.Canonicalizer(outputstream);
nu.xom.Document input = builder.build(file);
outputter.write(input);
 }
catch (Exception ex) {
System.err.println(ex);
ex.printStackTrace();
}

outputstream.close();

MessageDigest sha1 = MessageDigest.getInstance("SHA1");
sha1.reset();
sha1.update(java.nio.ByteBuffer.wrap(bytestream.toByteArray()));
salidasha1=sha1.digest();
String tagDigestValue=new String(Base64.encodeBase64(salidasha1));

Этот код может управлять файлами размером 200 МБ, и для канонизации требуется 7 минут, если у вас есть сомнения, см.Документация по XOM, она довольно понятна и содержит множество примеров.

Спасибо всем за ваши комментарии:)

...