因为您不知道您的产品中可能存在哪些元素Hit
类,你可以添加一个List<XElement>
财产给你的班级并附上[XmlAnyElement] https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlanyelementattribute%28v=vs.110%29.aspx归因于它。然后,它将捕获该类的 XML 中的所有未知元素。元素反序列化后,您可以添加 API 属性来查询具有特定名称的元素,例如:
public class Hit
{
// Since "id" is expected in the XML, deserialize it explicitly.
[XmlElement("id")]
public string Id { get; set; }
private readonly List<XElement> elements = new List<XElement>();
[XmlAnyElement]
public List<XElement> Elements { get { return elements; } }
#region convenience methods
public string this[XName name]
{
get
{
return Elements.Where(e => e.Name == name).Select(e => e.Value).FirstOrDefault();
}
set
{
var element = Elements.Where(e => e.Name == name).FirstOrDefault();
if (element == null)
Elements.Add(element = new XElement(name));
element.Value = value;
}
}
const string title = "Title";
[XmlIgnore]
public string Title
{
get
{
return this[title];
}
set
{
this[title] = value;
}
}
#endregion
}
顺便说一下,你可以消除你的Hits
类,如果您标记Hits
数组与[XmlArray] https://msdn.microsoft.com/en-US/library/system.xml.serialization.xmlarrayattribute(v=vs.110).aspx而不是[XmlElement]
,像这样:
[XmlRoot("SearchResponse")]
public sealed class SearchResponse
{
[XmlElement("Response", Type = typeof(Response))]
public Response[] Responses { get; set; }
[XmlElement("HitsCount", Type = typeof(HitsCount))]
public HitsCount[] HitsCount { get; set; }
[XmlArray("Hits")] // Indicates that the hits will be serialized with an outer container element named "Hits".
[XmlArrayItem("Hit")] // Indicates that each inner entry element will be named "Hit".
public Hit [] Hits { get; set; }
}
Update
The
public string this[XName name] { get; set; }
Is an indexer https://msdn.microsoft.com/en-us/library/6x16t2tx.aspx. See 使用索引器(C# 编程指南) https://msdn.microsoft.com/en-us/library/2549tw02.aspx。我添加了它,这样就可以很容易地执行以下操作:
var description = hit["Description"];
var title = hit["Title"];
索引器查找具有指定名称的第一个 XML 元素,并返回其文本值 https://msdn.microsoft.com/en-us/library/system.xml.linq.xelement.value%28v=vs.110%29.aspx。如果您不需要它,可以将其省略——这只是为了方便。