Add a node created to an existing node in XML document

1

Description. I must add a node to an XML document. The node that I have to add I build it perfectly, but I do not know how to insert it in the exact location I need inside the XML document.

Code. With this code I build and insert the new element, but I am inserting it at the end of the document as a new child node of the root element FacturaElectronica , and not where I want to:

   private void AddIdentificacionPolitica(string path)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.PreserveWhitespace = true;
            xmlDoc.Load(path);
            try
            {
                result = "";
                string uri = "http://www.w3.org/2000/09/xmldsig#";
                string URI = "http://uri.etsi.org/01903/v1.3.2#";

                XmlElement DigestMethod = xmlDoc.CreateElement("ds", "DigestMethod");
                XmlElement DigestValue = xmlDoc.CreateElement("ds", "DigestValue"); 

                XmlElement SignaturePolicyIdentifier = xmlDoc.CreateElement("xades", "SignaturePolicyIdentifier", URI);

                XmlElement SignaturePolicyId = xmlDoc.CreateElement("xades", "SignaturePolicyId", URI);
                SignaturePolicyIdentifier.AppendChild(SignaturePolicyId);

                XmlElement SigPolicyId = xmlDoc.CreateElement("xades", "SigPolicyId", URI);
                SignaturePolicyId.AppendChild(SigPolicyId);

                XmlElement Identifier = xmlDoc.CreateElement("xades", "Identifier", URI);
                Identifier.InnerText = "https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4.1/Resolucion_Comprobantes_Electronicos_DGT-R-48-2016.pdf";
                SigPolicyId.AppendChild(Identifier);

                XmlElement SigPolicyHash = xmlDoc.CreateElement("xades", "SigPolicyHash", URI);
                SignaturePolicyId.AppendChild(SigPolicyHash);

                DigestMethod = xmlDoc.CreateElement("ds", "DigestMethod",uri);
                DigestMethod.SetAttribute("Algorithm", "http://www.w3.org/2001/04/xmlenc#sha256");
                DigestValue = xmlDoc.CreateElement("ds", "DigestValue",uri);
                byte[] shaCertificate = { 0x06, 0xb3, 0x90, 0xb6, 0x45, 0xbb, 0x68, 0x3a, 0xde, 0x72, 0x8e, 0xb8, 0xf9, 0x79, 0x27, 0xd9, 0x18, 0x01, 0x67, 0xdb };
                SHA256 sigPolicyHash = SHA256Managed.Create();
                byte[] sigPolicyHashValue = sigPolicyHash.ComputeHash(shaCertificate);
                DigestValue.InnerText = Convert.ToBase64String(sigPolicyHashValue);
                SigPolicyHash.AppendChild(DigestMethod);
                SigPolicyHash.AppendChild(DigestValue);

                xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(SignaturePolicyIdentifier, true));
                xmlDoc.Save(path);
            }
            catch (Exception ex ){ result = ex.ToString(); }

        }

Expected result. In the image I show the document as it should be, and I highlight in blue where I should insert the new node. With the arrows frame to the parent node.

Question. How can I insert it exactly there?


XML as text. This is the complete XML document as it should be:

  <?xml version="1.0" encoding="UTF-8"?>

    -<FacturaElectronica xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <Clave>50601011800020570010500100001010000000003100000003</Clave>

    <NumeroConsecutivo>00100001010000000003</NumeroConsecutivo>

    <FechaEmision>2018-01-01T19:35:42.539375-06:00</FechaEmision>

    -<Emisor>

    <Nombre>Jorge Eduardo Jaime Castro</Nombre>

    -<Identificacion>

    <Tipo>01</Tipo>

    <Numero>205700105</Numero>

    </Identificacion>

    <NombreComercial>Jorge Eduardo Jaime Castro</NombreComercial>

    -<Ubicacion>

    <Provincia>2</Provincia>

    <Canton>03</Canton>

    <Distrito>01</Distrito>

    <Barrio>08</Barrio>

    <OtrasSenas>Grecia</OtrasSenas>

    </Ubicacion>

    -<Telefono>

    <CodigoPais>506</CodigoPais>

    <NumTelefono>83759107</NumTelefono>

    </Telefono>

    -<Fax>

    <CodigoPais>506</CodigoPais>

    <NumTelefono>83759107</NumTelefono>

    </Fax>

    <CorreoElectronico>[email protected]</CorreoElectronico>

    </Emisor>

    -<Receptor>

    <Nombre>Dental Care</Nombre>

    -<Identificacion>

    <Tipo>02</Tipo>

    <Numero>3001123208</Numero>

    </Identificacion>

    <NombreComercial/>

    -<Ubicacion>

    <Provincia>1</Provincia>

    <Canton>01</Canton>

    <Distrito>01</Distrito>

    <Barrio>01</Barrio>

    <OtrasSenas/>

    </Ubicacion>

    -<Telefono>

    <CodigoPais>506</CodigoPais>

    <NumTelefono>88888888</NumTelefono>

    </Telefono>

    -<Fax>

    <CodigoPais>506</CodigoPais>

    <NumTelefono>88888888</NumTelefono>

    </Fax>

    <CorreoElectronico>[email protected]</CorreoElectronico>

    </Receptor>

    <CondicionVenta>02</CondicionVenta>

    <PlazoCredito>15</PlazoCredito>

    <MedioPago>04</MedioPago>

    -<DetalleServicio>

    -<LineaDetalle>

    <NumeroLinea>1</NumeroLinea>

    -<Codigo>

    <Tipo>04</Tipo>

    <Codigo>3</Codigo>

    </Codigo>

    <Cantidad>1.000</Cantidad>

    <UnidadMedida>Unid</UnidadMedida>

    <UnidadMedidaComercial/>

    <Detalle>Servicios profesionales</Detalle>

    <PrecioUnitario>150000.00000</PrecioUnitario>

    <MontoTotal>150000.00000</MontoTotal>

    <NaturalezaDescuento/>

    <SubTotal>150000.00000</SubTotal>

    <MontoTotalLinea>150000.00000</MontoTotalLinea>

    </LineaDetalle>

    </DetalleServicio>

    -<ResumenFactura>

    <CodigoMoneda>USD</CodigoMoneda>

    <TipoCambio>576.74000</TipoCambio>

    <TotalServGravados>0.00000</TotalServGravados>

    <TotalServExentos>150000.00000</TotalServExentos>

    <TotalMercanciasGravadas>0.00000</TotalMercanciasGravadas>

    <TotalMercanciasExentas>0.00000</TotalMercanciasExentas>

    <TotalGravado>0.00000</TotalGravado>

    <TotalExento>150000.00000</TotalExento>

    <TotalVenta>150000.00000</TotalVenta>

    <TotalDescuentos>0.00000</TotalDescuentos>

    <TotalVentaNeta>150000.00000</TotalVentaNeta>

    <TotalImpuesto>0.00000</TotalImpuesto>

    <TotalComprobante>150000.00000</TotalComprobante>

    </ResumenFactura>

    -<Normativa>

    <NumeroResolucion>DGT-R-48-2016</NumeroResolucion>

    <FechaResolucion>20-02-2017 13:22:22</FechaResolucion>

    </Normativa>

    -<Otros>

    <OtroTexto codigo="obs">BNCR $ 200-</OtroTexto>

    </Otros>

    -<ds:Signature Id="Signature-b9789560-18b0-4e2c-9a14-284b8ba64371" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">

    -<ds:SignedInfo>

    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>

    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>


    -<ds:Reference Id="Reference-dd5d9aec-0842-4c5c-a07e-7fdae964fd65" URI="">

    -<ds:Transforms>

    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>

    </ds:Transforms>

    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>

    <ds:DigestValue>qYIYm7bmPDO7WdM1ycNmTMFeIRLbbY29NcLhjl/X/Rk=</ds:DigestValue>

    </ds:Reference>

    -<ds:Reference Id="ReferenceKeyInfo" URI="#KeyInfoId-Signature-b9789560-18b0-4e2c-9a14-284b8ba64371">

    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>

    <ds:DigestValue>DWE0SSn6ORzQ26HXmBPwG2VztoFCMTyNY7d6iP574QQ=</ds:DigestValue>

    </ds:Reference>

    -<ds:Reference URI="#SignedProperties-Signature-b9789560-18b0-4e2c-9a14-284b8ba64371" Type="http://uri.etsi.org/01903#SignedProperties">

    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>

    <ds:DigestValue>kb2iTXX9GbpIRoPzKwuO0JCyb+S/xb8L0vu1/DP6T6A=</ds:DigestValue>

    </ds:Reference>

    </ds:SignedInfo>

    <ds:SignatureValue Id="SignatureValue-b9789560-18b0-4e2c-9a14-284b8ba64371">bRDp6XQUIlNlfi/1rid9OOw3RUv/njCIfh5dp4YBfcEmJWuP8x1XmHvpjP2M4ulqI9zEPVdZXU9s9xuVRazzcN60L5ORHH6ruaiu4kJ5w4A44YYyynm4vD8dm08Tm20h3chvRozP4yZpFsxJtMItUGORITB8Vf+CWtld46X1ABt77/H6B42uZodcZZS1D1jeXxlm5Trk7ECFyrj7ci/pDlQqOJGHUJjfZi+36Yy9qCOXQJYLfUcXostOsiE0hZZ2dVfuw0LY0Xnl0c7oeHE3YEhY58wSigTFYp76nMkpo6/kbtEOLbGZHK7GaGfKaAFpW/NYM7ANkJWVO3pJMT5wew==</ds:SignatureValue>

    -<ds:KeyInfo Id="KeyInfoId-Signature-b9789560-18b0-4e2c-9a14-284b8ba64371">

    -<ds:X509Data>

<ds:X509Certificate>MIIFWzCCA0OgAwIBAgIGAWCqNgqhMA0GCSqGSIb3DQEBCwUAMGwxCzAJBgNVBAYTAkNSMSkwJwYDVQQKDCBNSU5JU1RFUklPIERFIEhBQ0lFTkRBIC0gU0FOREJPWDEMMAoGA1UECwwDREdUMSQwIgYDVQQDDBtDQSBQRVJTT05BIEZJU0lDQSAtIFNBTkRCT1gwHhcNMTcxMjMxMDEzNTU2WhcNMTkxMjMxMDEzNTU2WjCBozEZMBcGA1UEBRMQQ1BGLTAyLTA1NzAtMDEwNTEVMBMGA1UEBAwMSkFJTUUgQ0FTVFJPMRYwFAYDVQQqDA1KT1JHRSBFRFVBUkRPMQswCQYDVQQGEwJDUjEXMBUGA1UECgwOUEVSU09OQSBGSVNJQ0ExDDAKBgNVBAsMA0NQRjEjMCEGA1UEAwwaSk9SR0UgRURVQVJETyBKQUlNRSBDQVNUUk8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCBkqCjlZRYIi8NK6DKHw6sorkLT0WefbrBMFCs9q3FvgGWDUAafbF/BVj/1D93MWvLjG2UTchakN7ffNEJ/VhIyY2op9Ic2Fm89PTQuO6i54cAXp4KUaGayUglP+J0cc4PhTbv8nKxDTEAVy0KizAaeJH1Dt6fHexi+TTEbCknLi4N493In55V+Or7+qUDFPBRNA1q3TLQUhrqLUZ601s1dwC8jZN2I4QwCIF5EIoe9ThXk9Lq7dFAHRJfRsR/O/F/5isOLD1h6X4r9Nqtuw6viW4c7Ih2llrL9lyLjtP1bkUxAjUjwYT4XEdidMqGa17LHjUbQyOnCiBRjYQzcQ0fAgMBAAGjgcowgccwHwYDVR0jBBgwFoAURiPSRE+/V1kh5L+T1TCblUzj94cwHQYDVR0OBBYEFEO88WZA/WxKTb4MvKNWkovXs+6aMAsGA1UdDwQEAwIGwDATBgNVHSUEDDAKBggrBgEFBQcDBDBjBggrBgEFBQcBAQRXMFUwUwYIKwYBBQUHMAKGR2h0dHBzOi8vcGtpLmNvbXByb2JhbnRlc2VsZWN0cm9uaWNvcy5nby5jci9zdGFnL2ludGVybWVkaWF0ZS1wZi1wZW0uY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQAMrnw5cgcZylmFxvf6jRnC/l1iJBuWFEC5Mb3hFkGAXdqa0JpKyBAg8wqhF30gVPUrq7Wk27o2tZ00FbY6anK53sx7CaXWR1ctG+Zr9F421KTHB4ZU2IyU9MsRobd8dPBrUfcjHO3TVCvH9GO+aPBOQC99/awOyq06SXHFFoz2uc5Rkt26mQDsDh4mPkkldAiBp2Tgcr4b4Omy0PT+KoKYcyjC0r/QQ1f+Ipittzlb0ko58ZrfDwjY56kY/I70rVx9aXqv9TjGoiyRAcXNVyzKqtMEZ7hcuIm12b7wRkBBcMOOAk5xjueXxedp2iFXrbDz0HjEEhb0ohdAnOmhYy9OSn4I0M3+giBoTRUPxPFJPTE2vcaDRP1ihdy8DlZOz62kRYyV1Rf5xo/oWURgLtMUzftJNRci/CqM7TyiboJKsKq/osdJdyhf1BobkW0Ex43u/3+6qwE/lhq8kglENdanNWJBOwNea6VTw0SZL7eO47cFVmwCCk1FM47FuSWmJDV8xQ7NO58aJ22f2K3dNxASQhY6FKnP5KwxypSot1MxMmzgQTuUYI0nNGkimW7nrpmQO73tNpIFmshoc7I30O9S7CPtONdSfSfv0q6cLo1myj0bcH3bYmRUufrxQeZw4WRcm3JjHDzUsakE7Tn2ORekpU97i2oW1WCROlpki6cI5g==</ds:X509Certificate>

    </ds:X509Data>

    -<ds:KeyValue>

    -<ds:RSAKeyValue>

    <ds:Modulus>gZKgo5WUWCIvDSugyh8OrKK5C09Fnn26wTBQrPatxb4Blg1AGn2xfwVY/9Q/dzFry4xtlE3IWpDe33zRCf1YSMmNqKfSHNhZvPT00LjuoueHAF6eClGhmslIJT/idHHOD4U27/JysQ0xAFctCoswGniR9Q7enx3sYvk0xGwpJy4uDePdyJ+eVfjq+/qlAxTwUTQNat0y0FIa6i1GetNbNXcAvI2TdiOEMAiBeRCKHvU4V5PS6u3RQB0SX0bEfzvxf+YrDiw9Yel+K/TarbsOr4luHOyIdpZay/Zci47T9W5FMQI1I8GE+FxHYnTKhmteyx41G0MjpwogUY2EM3ENHw==</ds:Modulus>

    <ds:Exponent>AQAB</ds:Exponent>

    </ds:RSAKeyValue>

    </ds:KeyValue>

    </ds:KeyInfo>


    -<ds:Object Id="XadesObjectId-41071ab8-57e3-41dd-b91d-c11c9274a9f2">

    -<xades:QualifyingProperties Id="QualifyingProperties-0cd36699-c9b0-4495-81dc-0d9ef335dc90" Target="#Signature-b9789560-18b0-4e2c-9a14-284b8ba64371" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">

    -<xades:SignedProperties Id="SignedProperties-Signature-b9789560-18b0-4e2c-9a14-284b8ba64371">

    +<xades:SignedSignatureProperties>

    +<xades:SignedDataObjectProperties>

    </xades:SignedProperties>

    </xades:QualifyingProperties>

    </ds:Object>

    </ds:Signature>

    </FacturaElectronica>
    
asked by Efrain Mejias C 17.01.2018 в 13:54
source

1 answer

2

You are currently inserting the node at the end of the document with xmlDoc.DocumentElement.AppendChild(nodoNuevo) . The solution is to select the parent node where you want to insert it, and there:

nodoPadre.AppendChild(nodoNuevo);


These are the necessary steps to select and insert:

//Crear un XmlNamespaceManager para poder buscar en el namespace "xades:"
XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
nsManager.AddNamespace("xades", URI);

//Buscar con XPath y seleccionar el primer nodo "xades:SignedSignatureProperties"
XmlNode SignedSignatureProperties = xmlDoc.SelectSingleNode("//xades:SignedSignatureProperties", nsManager);

//Si se encontró el nodo, insertarle el nuevo
if (SignedSignatureProperties != null) {
    SignedSignatureProperties.AppendChild(SignaturePolicyIdentifier);
}
  • If you're wondering why I used //xades:SignedSignatureProperties to search for it, it's the XPath syntax .

    li>


Example:

I leave you a complete example with an XML that I cut a bit to reduce the number of lines, printing in console:

using System.Xml;
using System.Security.Cryptography;
//XML simplificado
string xmlOriginal = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<FacturaElectronica xmlns=""https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
  <Clave>50601011800020570010500100001010000000003100000003</Clave>
  <Otros>...</Otros>
  <ds:Signature xmlns:ds=""http://www.w3.org/2000/09/xmldsig#"" Id=""Signature-b9789560-18b0-4e2c-9a14-284b8ba64371"">
    <ds:SignedInfo>
      ...
    </ds:SignedInfo>
    <ds:SignatureValue Id=""SignatureValue-b9789560-18b0-4e2c-9a14-284b8ba64371"">...</ds:SignatureValue>
    <ds:KeyInfo Id=""KeyInfoId-Signature-b9789560-18b0-4e2c-9a14-284b8ba64371"">
    </ds:KeyInfo>
    <ds:Object Id=""XadesObjectId-41071ab8-57e3-41dd-b91d-c11c9274a9f2"">
      <xades:QualifyingProperties xmlns:xades=""http://uri.etsi.org/01903/v1.3.2#"" Id=""QualifyingProperties-0cd36699-c9b0-4495-81dc-0d9ef335dc90"" Target=""#Signature-b9789560-18b0-4e2c-9a14-284b8ba64371"">
        <xades:SignedProperties Id=""SignedProperties-Signature-b9789560-18b0-4e2c-9a14-284b8ba64371"">
          <xades:SignedSignatureProperties>
            <xades:SigningTime>bla bla bla</xades:SigningTime>
            <xades:SigningCertificate>
              aca va todo el certificate
            </xades:SigningCertificate>
          </xades:SignedSignatureProperties>
          <xades:SignedDataObjectProperties>
</xades:SignedDataObjectProperties>
        </xades:SignedProperties>
      </xades:QualifyingProperties>
    </ds:Object>
  </ds:Signature>
</FacturaElectronica>";


//TU CÓDIGO PARA GENERAR EL NODO NUEVO
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.PreserveWhitespace = true;
xmlDoc.LoadXml(xmlOriginal); // <-- acá lo estoy cargando manualmente desde el string
//xmlDoc.Load(path);
string result = "";
try
{
    string uri = "http://www.w3.org/2000/09/xmldsig#";
    string URI = "http://uri.etsi.org/01903/v1.3.2#";
    XmlElement DigestMethod = xmlDoc.CreateElement("ds", "DigestMethod");
    XmlElement DigestValue = xmlDoc.CreateElement("ds", "DigestValue");
    XmlElement SignaturePolicyIdentifier = xmlDoc.CreateElement("xades", "SignaturePolicyIdentifier", URI);
    XmlElement SignaturePolicyId = xmlDoc.CreateElement("xades", "SignaturePolicyId", URI);
    SignaturePolicyIdentifier.AppendChild(SignaturePolicyId);
    XmlElement SigPolicyId = xmlDoc.CreateElement("xades", "SigPolicyId", URI);
    SignaturePolicyId.AppendChild(SigPolicyId);
    XmlElement Identifier = xmlDoc.CreateElement("xades", "Identifier", URI);
    Identifier.InnerText = "https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4.1/Resolucion_Comprobantes_Electronicos_DGT-R-48-2016.pdf";
    SigPolicyId.AppendChild(Identifier);
    XmlElement SigPolicyHash = xmlDoc.CreateElement("xades", "SigPolicyHash", URI);
    SignaturePolicyId.AppendChild(SigPolicyHash);
    DigestMethod = xmlDoc.CreateElement("ds", "DigestMethod",uri);
    DigestMethod.SetAttribute("Algorithm", "http://www.w3.org/2001/04/xmlenc#sha256");
    DigestValue = xmlDoc.CreateElement("ds", "DigestValue",uri);
    byte[] shaCertificate = { 0x06, 0xb3, 0x90, 0xb6, 0x45, 0xbb, 0x68, 0x3a, 0xde, 0x72, 0x8e, 0xb8, 0xf9, 0x79, 0x27, 0xd9, 0x18, 0x01, 0x67, 0xdb };
    SHA256 sigPolicyHash = SHA256Managed.Create();
    byte[] sigPolicyHashValue = sigPolicyHash.ComputeHash(shaCertificate);
    DigestValue.InnerText = Convert.ToBase64String(sigPolicyHashValue);
    SigPolicyHash.AppendChild(DigestMethod);
    SigPolicyHash.AppendChild(DigestValue);



    //ACÁ EL CÓDIGO PARA INSERTARLO

    //Crear un XmlNamespaceManager para poder buscar en el namespace "xades:"
    XmlNamespaceManager nsManager = new XmlNamespaceManager(xmlDoc.NameTable);
    nsManager.AddNamespace("xades", URI);

    //Buscar con XPath y seleccionar el primer nodo "xades:SignedSignatureProperties"
    XmlNode SignedSignatureProperties = xmlDoc.SelectSingleNode("//xades:SignedSignatureProperties", nsManager);

    //Si se encontró el nodo padre, insertarle el nuevo
    if (SignedSignatureProperties != null) {
        SignedSignatureProperties.AppendChild(SignaturePolicyIdentifier);
    }


    //IMPRIMIR EN CONSOLA
    //xmlDoc.Save(path);
    XmlTextWriter writer = new XmlTextWriter(Console.Out);
    writer.Formatting = Formatting.Indented;
    xmlDoc.WriteTo( writer );
    writer.Flush();
    Console.WriteLine();
}
catch (Exception ex ){
    result = ex.ToString(); 
    Console.WriteLine(result);
}

Result:

<?xml version="1.0" encoding="UTF-8"?>

<FacturaElectronica xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2017/v4.2/facturaElectronica" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Clave>50601011800020570010500100001010000000003100000003</Clave>
  <Otros>...</Otros>
  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-b9789560-18b0-4e2c-9a14-284b8ba64371">
    <ds:SignedInfo>
      ...
    </ds:SignedInfo>
    <ds:SignatureValue Id="SignatureValue-b9789560-18b0-4e2c-9a14-284b8ba64371">...</ds:SignatureValue>
    <ds:KeyInfo Id="KeyInfoId-Signature-b9789560-18b0-4e2c-9a14-284b8ba64371">
    </ds:KeyInfo>
    <ds:Object Id="XadesObjectId-41071ab8-57e3-41dd-b91d-c11c9274a9f2">
      <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Id="QualifyingProperties-0cd36699-c9b0-4495-81dc-0d9ef335dc90" Target="#Signature-b9789560-18b0-4e2c-9a14-284b8ba64371">
        <xades:SignedProperties Id="SignedProperties-Signature-b9789560-18b0-4e2c-9a14-284b8ba64371">
          <xades:SignedSignatureProperties>
            <xades:SigningTime>bla bla bla</xades:SigningTime>
            <xades:SigningCertificate>
              aca va todo el certificate
            </xades:SigningCertificate>
          <xades:SignaturePolicyIdentifier><xades:SignaturePolicyId><xades:SigPolicyId><xades:Identifier>https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4.1/Resolucion_Comprobantes_Electronicos_DGT-R-48-2016.pdf</xades:Identifier></xades:SigPolicyId><xades:SigPolicyHash><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /><ds:DigestValue>7XUCtw/f4o/yTilOqK8RXLFzYGeHMw9luOdMzLbCU/w=</ds:DigestValue></xades:SigPolicyHash></xades:SignaturePolicyId></xades:SignaturePolicyIdentifier></xades:SignedSignatureProperties>
          <xades:SignedDataObjectProperties>
</xades:SignedDataObjectProperties>
        </xades:SignedProperties>
      </xades:QualifyingProperties>
    </ds:Object>
  </ds:Signature>
</FacturaElectronica>

Demo: link

    
answered by 17.01.2018 / 15:56
source