Wie ein Stax XML-Objekt canonicalize
-
03-10-2019 - |
Frage
ich will canonicalize ein Stax Objekt, das Programm es es mit DOM zu tun, sondern dom kann große XML-Dokumente nicht verwalten (wie 1 GB), so STAX ist es die Lösung.
Der Code, den ich habe es das:
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));
Die Idee ist es, den Code tun unten mit Stax ...
Thx:)
Lösung
ich dieses Problem mit XOM Bibliothek lösen, hier ist der entsprechende Code.
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));
Dieser Code kann Dateien von 200Mb zu verwalten und 7 Minuten, um die Kanonisierung zu tun, wenn Sie Zweifel haben, die finden Sie in der Dokumentation XOM, es ist ziemlich klar, und viele Beispiele haben.
Thx an alle für Ihre Kommentare:)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow