Manipulação de XML

Boa tarde a todos,
pesquisei no forum sobre manipulação de xml, encontrei muita coisa que me ajudou bastante a começar a trabalhar com XML.
Porem cheguei a um ponto onde não consegui uma solução.
Preciso assinar o xml da NFe que será enviado ao cliente. E preciso adicionar as tag’s ref. ao protocolo de autorização dessa NFe.
O que eu preciso é juntar dois xml’s um deles é os dados da NFe do cliente ja assinada, outro é as informações do protocolo de autorização dessa NFe.
Como posso fazer isso ?

Você já sabe como assinar?

http://today.java.net/pub/a/today/2006/11/21/xml-signature-with-jsr-105.html?page=1
http://portalnfe.fazenda.mg.gov.br/download.html
http://www.testexpert.com.br/?q=node/999
https://www.certisign.com.br/treinamento/guias-gratuitos/pdf/WebServices.pdf
http://javafree.uol.com.br/noticia/2615/
http://developers.sun.com/appserver/reference/techart/mutual_auth.html

Sim, tenho uma classe que ja faz a assinatura digital no xml.
Porem minha classe assina essa estrutura de xml.

<?xml version="1.0" encoding="UTF-8" ?>
  • { demais tag’s do xml }

    { Assinatura digital, faz a assinatura corretamente. Inclusive posso visualizar e validar, no programa visualizador fornecido pela receita }

Mas para o xml que vai para o Destinatario, que começa com :

....

Dessa forma quando gero as tag’s ref. ao dados do protocolo de autorização e mando fazer assinatura digital, as informações da assinatura digital fica fora da tag NFe.
Meu método de assinatura é esse :

 public static String assinarEnviNFe(String xml, String localXMLCliente) throws Exception {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes()));

    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
    ArrayList transformList = new ArrayList();
    TransformParameterSpec tps = null;
    Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED, tps);
    Transform c14NTransform = fac.newTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);

    transformList.add(envelopedTransform);
    transformList.add(c14NTransform);

    File certificado = new File( System.getProperty("user.dir") + "/certificados/certificado_cliente.pfx");
    String password = criptSenha.decriptografarSenha( config.getSenhaAssDig());
    KeyStore ks = KeyStore.getInstance("PKCS12");
    char[] pwd = password.toCharArray();
    InputStream is = new FileInputStream( certificado );
    ks.load(is, pwd);

    KeyStore.PrivateKeyEntry pkEntry = null;
    Enumeration aliasesEnum = ks.aliases();
    PrivateKey privateKey = null;
    while (aliasesEnum.hasMoreElements()) {
        String alias = (String) aliasesEnum.nextElement();
        System.out.println("Alias: " + alias);
        if (ks.isKeyEntry(alias)) {
            pkEntry = (KeyStore.PrivateKeyEntry) ks
					.getEntry(alias, new KeyStore.PasswordProtection(
					criptSenha.decriptografarSenha(config.getSenhaAssDig()).toCharArray()));
            privateKey = pkEntry.getPrivateKey();
            break;
        }
    }

    X509Certificate cert = (X509Certificate) pkEntry.getCertificate();
    KeyInfoFactory kif = fac.getKeyInfoFactory();
    List x509Content = new ArrayList();
    x509Content.add(cert);
    X509Data xd = kif.newX509Data(x509Content);
    KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

    NodeList elements = doc.getElementsByTagName("infNFe");
    Element el = (Element) elements.item(0);
    String id = el.getAttribute("Id");

    Reference ref = fac.newReference("#".concat(id), fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);
    SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));
    XMLSignature signature = fac.newXMLSignature(si, ki);
    DOMSignContext dsc = new DOMSignContext( privateKey, doc.getDocumentElement());
    System.out.println(dsc.toString());
    signature.sign(dsc);

    OutputStream os = new FileOutputStream( localXMLCliente );
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer trans = tf.newTransformer();
    trans.transform(new DOMSource(doc), new StreamResult(os));

    ByteArrayOutputStream os2 = new ByteArrayOutputStream();
    TransformerFactory tf2 = TransformerFactory.newInstance();
    Transformer trans2 = tf2.newTransformer();
    trans.transform(new DOMSource(doc), new StreamResult(os2));
    return os2.toString();
}