gpt4 book ai didi

c# - 将对象序列化为 XmlDocument

转载 作者:可可西里 更新时间:2023-11-01 07:54:58 25 4
gpt4 key购买 nike

为了在SoapException.Detail中返回有用的信息对于 asmx web 服务,我从 WCF 中汲取灵感并创建了一个故障类来包含上述有用信息。然后将该故障对象序列化为所需的 XmlNode抛出的SoapException .

我想知道我是否有最好的代码来创建 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 包装在 <detail> 中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 <detail> 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 <detail> element
var rootNode = detailDocument.AppendChild(detailDocument.CreateNode(XmlNodeType.Element, "detail", ""));
rootNode.AppendChild(infoNode);

Console.WriteLine(detailDocument.OuterXml);
Console.ReadKey();
}

最佳答案

编辑:在细节元素内创建输出

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;
}

关于c# - 将对象序列化为 XmlDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/781442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com