我有一个WCF服务,它获取发送的XML文件,其中节点可以变化,尽管根元素总是相同的。有些文件可能如下所示:
<MyXML xmlns="something">
<xmlDoc>
<element1>Value</element1>
<element2>Value</element2>
</xmlDoc>
</MyXML>
虽然其他人看起来像这样
<MyXML xmlns="something">
<xmlDoc>
<otherelement1>Value</otherelement1>
<child1>
<element3>Value</element3>
<element2>Value</element2>
</child1>
</xmlDoc>
</MyXML>
因为我无法知道它们的外观,我想要做的只是抓住整个元素然后解析它,但是现在我只能得到第一个子元素(element1)。我的服务界面如下所示:
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Xml,
RequestFormat = WebMessageFormat.Xml,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "auth")]
ResponseData Auth(MyXML rData);
}
我的datacontract看起来像这样:
[DataContract(Namespace = "something")]
public class MyXML
{
[DataMember]
public XmlElement xmlDoc { get; set; }
}
但在我的服务中,我只是从XML获得第一个元素 - 即
<element1>Value</element1>
所以我的问题是,这会有效吗?我需要改变什么?我尝试将数据合同作为List而不是
[DataContract(Namespace = "something")]
public class MyXML
{
[DataMember]
public List<XmlElement> xmlDoc { get; set; }
}
但是刚刚返回一个空列表。我是WCF的新手,所以如果需要任何其他细节,请告诉我。
答案 0 :(得分:0)
好的,事实证明这真的很容易解决 - 我实际上是从Android应用程序编写XML,所以我有幸改变结构。我只是添加了一个内部节点,所以我的XML来自这个
<MyXML xmlns="something">
<xmlDoc>
<otherelement1>Value</otherelement1>
<child1>
<element3>Value</element3>
<element2>Value</element2>
</child1>
</xmlDoc>
到此:
<MyXML xmlns="something">
<xmlDoc>
<xmlDocInner>
<otherelement1>Value</otherelement1>
<child1>
<element3>Value</element3>
<element2>Value</element2>
</child1>
</xmlDocInner>
</xmlDoc>
现在,当我获得xmlDoc元素时,我将所有内容都放在xmlDocInner节点中。如果没有内部节点作为缓冲区,它仍然会引出如何获取整个元素的问题,但我对此感到满意。
答案 1 :(得分:0)
要访问原始XML,use the Message
class,而不是DataContract
。如果你想让POCO帮助你,你可能会被XmlSerializer
困住。
static class SchemaConstants
{
public const string Namespace = "something";
}
[XmlType(Namespace = SchemaConstants.Namespace)]
[XmlRoot(Namespace = SchemaConstants.Namespace)]
public class xmlDoc
{
// case 1
public string element1;
public string element2;
// case 2
public string otherelement1;
public child1 child1;
}
[XmlType(Namespace = SchemaConstants.Namespace)]
public class child1
{
public string element3;
public string element2;
}
任何不存在的成员都将被反序列化为null。您必须mark your contract or service implementation with the [XmlSerializerFormat]
attribute。
第一个例子的结果:
第二个例子的结果:
您还可以使用实现IXmlSerializer
接口的类型并自行处理反序列化。