将对象序列化为XmlDocument

为了在Asapx Web服务的SoapException.Detail返回有用的信息,我从WCF中获取了一个想法并创建了一个包含所述有用信息的错误类。 然后将该fault对象序列化为抛出的SoapException所需的XmlNode

我想知道我是否有最好的代码来创建XmlDocument – 这是我对它的看法:

 var xmlDocument = new XmlDocument(); var serializer = new XmlSerializer(typeof(T)); using (var stream = new MemoryStream()) { serializer.Serialize(stream, theObjectContainingUsefulInformation); stream.Flush(); stream.Seek(0, SeekOrigin.Begin); xmlDocument.Load(stream); } 

有更好的方法吗?

更新:我实际上最终执行了以下操作,因为除非您将XML包装在 xml元素中,否则您将在客户端获得SoapHeaderException

 var serialiseToDocument = new XmlDocument(); var serializer = new XmlSerializer(typeof(T)); using (var stream = new MemoryStream()) { serializer.Serialize(stream, e.ExceptionContext); stream.Flush(); stream.Seek(0, SeekOrigin.Begin); serialiseToDocument.Load(stream); } // Remove the xml declaration serialiseToDocument.RemoveChild(serialiseToDocument.FirstChild); // Memorise the node we want var serialisedNode = serialiseToDocument.FirstChild; // and wrap it in a  element var rootNode = serialiseToDocument.CreateNode(XmlNodeType.Element, "detail", ""); rootNode.AppendChild(serialisedNode); 

更新2:鉴于John Saunders出色的答案,我现在开始使用以下内容:

 private static void SerialiseFaultDetail() { var fault = new ServiceFault { Message = "Exception occurred", ErrorCode = 1010 }; // Serialise to the XML document var detailDocument = new XmlDocument(); var nav = detailDocument.CreateNavigator(); if (nav != null) { using (XmlWriter writer = nav.AppendChild()) { var ser = new XmlSerializer(fault.GetType()); ser.Serialize(writer, fault); } } // Memorise and remove the element we want XmlNode infoNode = detailDocument.FirstChild; detailDocument.RemoveChild(infoNode); // Move into a root  element var rootNode = detailDocument.AppendChild(detailDocument.CreateNode(XmlNodeType.Element, "detail", "")); rootNode.AppendChild(infoNode); Console.WriteLine(detailDocument.OuterXml); Console.ReadKey(); } 

编辑:在detail元素内创建输出

 public class MyFault { public int ErrorCode { get; set; } public string ErrorMessage { get; set; } } public static XmlDocument SerializeFault() { var fault = new MyFault { ErrorCode = 1, ErrorMessage = "This is an error" }; var faultDocument = new XmlDocument(); var nav = faultDocument.CreateNavigator(); using (var writer = nav.AppendChild()) { var ser = new XmlSerializer(fault.GetType()); ser.Serialize(writer, fault); } var detailDocument = new XmlDocument(); var detailElement = detailDocument.CreateElement( "exc", SoapException.DetailElementName.Name, SoapException.DetailElementName.Namespace); detailDocument.AppendChild(detailElement); detailElement.AppendChild( detailDocument.ImportNode( faultDocument.DocumentElement, true)); return detailDocument; }