/// <summary>
        /// Create signature properties from existing document
        /// </summary>
        /// <param name="element"></param>
        /// <param name="nsm"></param>
        internal XadesSignatureProperties(XmlElement element, XmlNamespaceManager nsm)
        {
            // read from xml
            XmlElement signedSignatureProperties = element["SignedSignatureProperties", Xades.XadesNamespaceUrl];

            // signing time
            if (DateTime.TryParse(signedSignatureProperties?["SigningTime", Xades.XadesNamespaceUrl]?.InnerText, out DateTime signingTime))
            {
                SigningTime = signingTime;
            }

            // signing certificate; currently only one certificate supported
            //foreach (XmlElement cert in element.SelectNodes("xades:SignedSignatureProperties/xades:SigningCertificate/xades:Cert", nsm))
            //{
            // TODO: read certificate information and expose as public read-only array
            //}

            // signature policy
            XmlElement signaturePolicyIdentifier = signedSignatureProperties["SignaturePolicyIdentifier", Xades.XadesNamespaceUrl];
            XmlElement signaturePolicyImplied    = signaturePolicyIdentifier?["SignaturePolicyImplied", Xades.XadesNamespaceUrl];
            XmlElement signaturePolicyId         = signaturePolicyIdentifier?["SignaturePolicyId", Xades.XadesNamespaceUrl];

            if (signaturePolicyImplied != null)
            {
                PolicyImplied = true;
            }
            else if (signaturePolicyId != null)
            {
                PolicyId = ObjectIdentifier.TryParseFromParent(signaturePolicyId, "SigPolicyId", Xades.XadesNamespaceUrl);

                XmlElement transformChain = signaturePolicyId.SelectSingleNode("ds:Transforms", nsm) as XmlElement;
                if (transformChain != null)
                {
                    PolicyTransformChain = new TransformChain();
                    MethodInfo loadXmlInfo = typeof(TransformChain).GetMethod("LoadXml", BindingFlags.NonPublic | BindingFlags.Instance);
                    loadXmlInfo.Invoke(PolicyTransformChain, new object[] { transformChain });
                }

                DigestAlgAndValue digestInfo = DigestAlgAndValue.TryParse(signaturePolicyId["SigPolicyHash", Xades.XadesNamespaceUrl]);
                PolicyDigestMethod = digestInfo.Algorithm;
                PolicyDigest       = digestInfo.Digest;

                XmlElement signaturePolicyQualifiers = signaturePolicyIdentifier["SigPolicyQualifiers", Xades.XadesNamespaceUrl];
                if (signaturePolicyQualifiers != null)
                {
                    PolicyURIs = signaturePolicyQualifiers.SelectNodes("xades:SigPolicyQualifier/xades:SPURI", nsm).OfType <XmlElement>().Select(x => x.InnerText).ToList();
                    //PolicyNotices = signaturePolicyQualifiers.SelectNodes("xades:SigPolicyQualifier/xades:SPUserNotice", nsm).OfType<XmlElement>().Select(x => new PolicyUserNotice(x)).ToList();
                }
            }
        }