繁体   English   中英

在没有根元素的情况下规范原始XML数据

[英]canonize raw xml data without root element

我有2部分XML数据,我必须将它们标准化并创建摘要:

<header authenticate="true">
        <static>
            <HostID>MMM</HostID>
            <TransactionID>98B230CF5FB220FD75FE916949378C2F</TransactionID>
        </static>
        <mutable>
            <TransactionPhase>Receipt</TransactionPhase>
        </mutable>
    </header>

<TransferReceipt authenticate="true">
            <ReceiptCode>0</ReceiptCode>
        </TransferReceipt>

如果我只连接两个字符串,然后将它们作为byte []发送到canonnizer,则会出现异常:

org.xml.sax.SAXParseException; lineNumber: 9; columnNumber: 15; Markup im Dokument nach dem Root-Element muss ordnungsgemõ▀ formatiert sein.
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:338)
        at org.apache.xml.security.c14n.Canonicalizer.canonicalize(Unknown Source)
        at de.martinm.tools.Utils.DSTools.canonize_data(DSTools.java:141)
        at de.martinm.tools.Utils.DSTools.getDigest(DSTools.java:244)
        at de.martinm.tools.EBICS.EBICSKernel.send_ack(EBICSKernel.java:1039)
        at de.martinm.tools.EBICS.EBICSKernel.process(EBICSKernel.java:1135)
        at de.martinm.tools.EBICS.EBICSKernel.main(EBICSKernel.java:1145)

如何将数据连接起来以便被规范化,并且在通过Internet发送后,接收方可以验证摘要?

我知道,该数据不是xml有效的,因为它没有单个根元素。

我找不到如何格式化数据的描述。

这是代码:

public byte[] getDigest(byte[] data) {


        byte[] hash = null;
        String algorithm="SHA-256";

        try {           
            MessageDigest digest = MessageDigest.getInstance(algorithm);
            byte[] canonical_data = canonize_data(data);
            hash = digest.digest(canonical_data);
            logger.debug("hash created: {}", Hex.encodeHexString(hash));
        } catch (NoSuchAlgorithmException e) {
            logger.error(algorithm, e);
        };
        return hash;
    }

    public byte[] canonize_data(byte[] data) {

        byte[] canonical_data=null;

        try {
            Canonicalizer c14n = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
            canonical_data = c14n.canonicalize(data);
        } catch (InvalidCanonicalizerException | CanonicalizationException | ParserConfigurationException | IOException | SAXException e) {
            logger.error(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS, e);
        }
        logger.debug("data canonized");
        return canonical_data;      
    }

格式正确的XML文档只有一个根元素,它是所有其他元素和所有文本节点的祖先。 因此,简单地串联两个格式正确的XML文档的结果本身并不是格式良好的XML文档。 它没有根元素(或者有两个,取决于您要如何看待它)。

您应该能够通过合成容器元素作为根并保留原始两个元素的内容来执行您描述的操作。 至少,您可以通过这种方式获得格式正确的组合文档。

诀窍是,您必须分别规范每个代码段,然后将接收到的字节合并到一个新的字节数组中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM