我正在尝试使用.NET 4.0和WCF创建REST Web服务。我的REST服务正在返回一个List,然后将其序列化为XML。我遇到的问题是返回的XML以ArrayOf开头,我不喜欢。
换句话说,现在XML看起来像这样:
<ArrayOfAchievement>
<Achievement>
...
</Achievement>
</ArrayOfAchievement>
我希望XML看起来像这样:
<Achievements>
<Achievement>
...
</Achievement>
</Achievements>
如果我创建一个新类并将其命名为AchievementsList,其属性为List&lt;成就&gt;,如下:
public class AchievementsList
{
public List<Achievement> Achievements { get; set; }
}
然后我的服务返回上面的类而不是List&lt;成就&gt;,XML最终看起来像这样:
<AchievementsList>
<Achievements>
<Achievement>
...
</Achievement>
</Achievements>
</AchievementsList>
哪个错误(因为它增加了不属于那里的另一个级别)。
另一个问题是我还需要在对象中应用命名空间,如下所示:
[XmlRoot(Namespace="NameSpaceURL")]
public class AchievementsList
{
public List<Achievement> Achievements { get; set; }
}
如果我只返回一个List&lt;成就&GT;
那么我可以对这两个问题做些什么呢?
巴拉
答案 0 :(得分:4)
您使用AchievementList
类走在正确的轨道上,但您需要做的是使用Achievements
属性修饰XmlElement
list属性,并提供各个元素的名称。
命名空间在AchievementList
类上,就像你拥有它一样。
示例代码:
[Serializable]
public class Achievement {
public string Name { get; set; }
}
[Serializable]
[XmlRoot(ElementName="Achievements", Namespace="http://www.mynamespace.com")]
public class AchievementList
{
[XmlElement("Achievement")]
public List<Achievement> Achievements { get; set; }
public AchievementList()
{
Achievements = new List<Achievement>();
}
public void Add(Achievement a)
{
Achievements.Add(a);
}
}
您的输出将是:
<?xml version="1.0" encoding="utf-16"?>
<Achievements xmlns="http://www.mynamespace.com">
<Achievement>
<Name>Woke Up</Name>
</Achievement>
<Achievement>
<Name>Went to work</Name>
</Achievement>
<Achievement>
<Name>Slacked off</Name>
</Achievement>
</Achievements>}
答案 1 :(得分:1)
我有类似的设置:从AchievementsList
派生List<Achievement>
,使用XmlTypeAttribute
和XmlRootAttribute
进行装饰,并使用Achievement
装饰XmlTypeAttribute
[XmlType(TypeName = "Achievements", Namespace="http://www.mynamespace.com")]
[XmlRoot(ElementName = "Achievements", Namespace="http://www.mynamespace.com")]
public class AchievementsList : List<Achievement>
{
}
[XmlType(TypeName = "Achievement", Namespace="http://www.mynamespace.com")]
public class Achievement
{
...
}
:
XmlSerializerFormat
我还使用DataContract
属性修饰了我的服务实现,因此我可以避免通常的{{1}}序列化。
答案 2 :(得分:1)
我问了related question如何反序列化返回List<SomeType>
的WCF Web服务方法生成的XML。
XML有一个名为<ArrayOfSomeType>
的根,为了将其反序列化为List<SomeType>
,必须使用DataContractSerializer
而不是XmlSerializer
,因为它们不兼容。< / p>