-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathXmlHelper.cs
99 lines (81 loc) · 3.56 KB
/
XmlHelper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace JpManifestoNFE
{
class XmlHelper
{
/// <summary>
/// Serializa um objeto de tipo presente em XsdClasses para um XmlDocument;
/// </summary>
/// <param name="toXmlDoc"></param>
/// <param name="objType"></param>
/// <returns></returns>
public static XmlDocument ParseToXmlDocument(object toXmlDoc, Type objType, string defaultNamespace)
{
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer xmlSerializer = new XmlSerializer(objType);//, defaultNamespace);
var defaultEncoding = Encoding.UTF8;
var writerSettings = new XmlWriterSettings();
writerSettings.Encoding = defaultEncoding;
XmlDocument doc = new XmlDocument();
using (var mStream = new MemoryStream())
{
using (var reader = new StreamReader(mStream))
{
using (var xmlWriter = XmlWriter.Create(mStream, writerSettings))
{
xmlSerializer.Serialize(xmlWriter, toXmlDoc, ns);
mStream.Seek(0, SeekOrigin.Begin);
string xml = reader.ReadToEnd();
doc.PreserveWhitespace = false;
/*A deserilização dos objetos diretamente em xml, gerava alguns namespaces indevidos,
que ocasionam erros ao assinar os documentos (quando requerido) ex: Asinatura difere do calculado.
Por isso, ao serializar o documento, é removido todos os namespaces, porém, ao remove-los todos os
outros namespaces, e o nome das propriedades são inseridos depois de q1: ou :q1, sendo então necessário
remove-los manualmente da string representando o arquivo XML.*/
doc.LoadXml(xml.Replace(":q1", "").Replace("q1:", ""));
}
}
}
return doc;
}
/// <summary>
/// Deserializa um nó Xml para uma instância de um objeto de tipo especificado em XsdClasses;
/// </summary>
/// <param name="xmlNode"></param>
/// <param name="typeToConvert"></param>
/// <returns></returns>
public static T ParseFromXml<T>(XmlNode xmlNode, Type typeToConvert)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeToConvert);
XmlDocument doc = new XmlDocument();
XmlNode toImport = doc.ImportNode(xmlNode, true);
doc.AppendChild(toImport);
using (var sReader = new StringReader(xmlNode.OuterXml))
{
var des = xmlSerializer.Deserialize(sReader);
return (T)des;
}
}
/// <summary>
/// Deserializa um documento Xml para uma instância de um objeto de tipo especificado em XsdClasses;
/// </summary>
/// <param name="xmlNode"></param>
/// <param name="typeToConvert"></param>
/// <returns></returns>
public static T ParseFromXml<T>(XmlDocument xmlDoc, Type typeToConvert)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeToConvert);
using (var sReader = new StringReader(xmlDoc.OuterXml))
{
var des = xmlSerializer.Deserialize(sReader);
return (T)des;
}
}
}
}