如何在WCF数据协定中处理xs:any

时间:2010-07-04 21:22:11

标签: wcf xsd svcutil.exe xsd.exe

在WCF上摸不着头......我收到了<DataFields>的孩子可以是任何东西的XML消息,例如...

<Test1Root> 
  <CaseNo></CaseNo>
  <Activity></Activity>
  <DataFields>
     <AccountRef></AccountRef>
     <PropRef></PropRef>
     <User></User>
  </DataFields>
</Test1Root>

我使用<xs:any>的{​​{1}}在BizTalk中处理了这个...

<DataFields>

但我很难看到如何在WCF <xs:element name="DataFields"> <xs:complexType> <xs:sequence> <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" /> </xs:sequence> </xs:complexType> </xs:element> ...

中处理这个问题

我尝试使用 svcutil.exe xsd.exe 来创建类,它们都提供了主要元素(CaseNo,Activity等),但都没有似乎处理xs:任何DataFields ......

  • svcutil将DataFields作为XmlElement
  • xsd将其作为类,但使用类型为XmlElement []
  • 的Any属性

是否可以更好地处理子元素?

3 个答案:

答案 0 :(得分:2)

嗯,xs:any可以是任何东西,所以.NET工具可以做的最好的就是给你一个对象数组....

因为它可以是任何东西,你真的没什么可做的,对吧?它可以是任何东西......所以你需要使用一种可能是任何东西的类型。

如果您确实需要XML架构中的xs:any,并且无法替换为例如一组更具体的xs:element(可能是彼此继承),我不知道你怎么能得到更好的支持......

答案 1 :(得分:0)

你可以这样做。我在服务中做了很多次。我没有多做WCF服务,但我相信它们的工作方式相同。模式中的<xs:any>将转换为代码中的XmlElement。在你的情况下是一个XmlElement数组。

答案 2 :(得分:0)

我在旧的Web服务中遇到了一些问题,WSDL使用“any”元素定义了响应属性。

使用自定义消息格式化程序解决了问题。写了一篇关于它的帖子,更详细地描述了解决方案http://devdump.wordpress.com/2012/10/26/working-with-legacy-web-services-and-wcf/,希望它能节省其他时间,因为这是我能找到的关于这个主题的唯一讨论。