/*
Problema al agregar nodo a documento XML
https://es.stackoverflow.com/q/131654/127
*/
using System;
using System.Xml;
using System.Security.Cryptography;
public class Test
{
public static void Main()
{
//XML simplificado
string xmlOriginal = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<FacturaElectronica xmlns=""https://t...content-available-to-author-only...o.cr/docs/esquemas/2017/v4.2/facturaElectronica"" xmlns:xsi=""http://w...content-available-to-author-only...3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://w...content-available-to-author-only...3.org/2001/XMLSchema"">
<Clave>50601011800020570010500100001010000000003100000003</Clave>
<Otros>...</Otros>
<ds:Signature xmlns:ds=""http://w...content-available-to-author-only...3.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://u...content-available-to-author-only...i.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://w...content-available-to-author-only...3.org/2000/09/xmldsig#";
string URI = "http://u...content-available-to-author-only...i.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://t...content-available-to-author-only...o.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://w...content-available-to-author-only...3.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);
}
}
}