【发布时间】:2018-05-03 15:26:22
【问题描述】:
我正在尝试反序列化来自 Web API 服务的 xml。仅当我使用指定根节点名称和命名空间的根节点 XmlRootAttribute 类型实例化 XmlSerializer 对象时,它才有效。如果它是只有一个根节点的正确 xml,为什么我需要告诉它根的名称?我看到人们不这样做的例子。我希望尽可能保持通用性。
这是反序列化的代码。我希望注释掉的行在我没有指定根节点的情况下工作,但它在底部给出了错误。
public static T xmlToObject<T>(string strXML)
{
XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "QIMonthReturn";
xRoot.Namespace = "QI.Measures.API";
XmlSerializer serializer = new XmlSerializer(typeof(T), xRoot);
//XmlSerializer serializer = new XmlSerializer(typeof(T));
StringReader rdr = new StringReader(strXML);
return (T)serializer.Deserialize(rdr);
}
错误(我去掉了尖括号):
{"There is an error in XML document (2, 2)."}
{"QIMonthReturn xmlns='QI.Measures.API' was not expected."}
类:
public class QIMonth
{
[XmlElement(ElementName = "Date", DataType = "dateTime")]
public DateTime Date { get; set; }
[XmlElement(ElementName = "Numerator", DataType = "boolean")]
public bool Numerator { get; set; }
[XmlElement(ElementName = "Denominator", DataType = "boolean")]
public bool Denominator { get; set; }
}
[XmlRoot("QIMonthReturn")]
public class QIMonthReturn
{
public QIMonthReturn()
{
Months = new List<QIMonth>();
}
[XmlElement(ElementName = "PatientKey")]
public string PatientKey { get; set; }
[XmlArray("Months"), XmlArrayItem("QIMonth")]
public List<QIMonth> Months { get; set; }
}
我确实在 QIMonth 上面有 XmlRoot 属性,但取出来了,不知道是否需要。
我在哪里添加命名空间:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.Clear();
config.Formatters.Add(new CustomNamespaceXmlFormatter("QI.Measures.API") { UseXmlSerializer = true });
}
【问题讨论】:
-
向我们展示您的 C# 类模型定义。