Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 规范化没有根元素的原始xml数据_Java_Xml_Digest_Canonicalization - Fatal编程技术网

Java 规范化没有根元素的原始xml数据

Java 规范化没有根元素的原始xml数据,java,xml,digest,canonicalization,Java,Xml,Digest,Canonicalization,我有两部分XML数据需要规范化并创建摘要: <header authenticate="true"> <static> <HostID>MMM</HostID> <TransactionID>98B230CF5FB220FD75FE916949378C2F</TransactionID> </static> <m

我有两部分XML数据需要规范化并创建摘要:

<header authenticate="true">
        <static>
            <HostID>MMM</HostID>
            <TransactionID>98B230CF5FB220FD75FE916949378C2F</TransactionID>
        </static>
        <mutable>
            <TransactionPhase>Receipt</TransactionPhase>
        </mutable>
    </header>
如何连接数据以使其能够被规范化,并且在通过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文档。它没有根元素(或者它有两个根元素,这取决于您想如何看待它)


您应该能够通过合成一个容器元素作为根元素并保存原始两个元素的内容来实现您所描述的。至少,您可以通过这种方式获得格式良好的组合文档。

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

如果您只是连接文件,则有两个XML中不允许的根元素。您需要在它们周围包装另一个元素,或者以某种方式组合它们。不,没有没有根元素的XML数据,所以在解决该问题之前,请停止。有关正确答案,请参阅。
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)
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;      
    }