【问题标题】:How to handle xs:any in WCF Data Contract [duplicate]如何在 WCF 数据合同中处理 xs:any [重复]
【发布时间】:2011-03-11 17:09:14
【问题描述】:

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

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

我已经在 BizTalk 中使用 &lt;xs:any&gt; 处理了这个问题 &lt;DataFields&gt; ...

<xs:element name="DataFields">
  <xs:complexType>
    <xs:sequence>
      <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

但我正在努力寻找如何在 WCF [DataContract] 中处理这个问题......

我尝试同时使用 svcutil.exe 和 xsd.exe 来创建类,它们都提供了主要元素(CaseNo、Activity 等),但都没有似乎可以处理 xs:any of DataFields ...

  • svcutil 将 DataFields 用作 XmlElement
  • xsd 将它作为一个类,但具有 XmlElement [] 类型的 Any 属性

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

【问题讨论】:

    标签: wcf xsd svcutil.exe xsd.exe


    【解决方案1】:

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

    既然它可以是任何东西,你真的无能为力,对吧?它可以是任何东西......所以你需要使用可以是任何东西的类型。

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

    【讨论】:

    • 感谢您的回复,我有点期待它,但有一个(微弱的)希望有一个非常巧妙的方法来处理这个
    【解决方案2】:

    你可以这样做。我在服务中做过很多次。我没有做太多 WCF 服务,但我相信它们的工作方式相同。架构中的 &lt;xs:any&gt; 在代码中被转换为 XmlElement。在你的情况下,一个 XmlElement 数组。

    【讨论】:

    • 看起来我的 '' 是从上面处理的。它应该是这样写的:架构中的“”在代码中被转换为 XmlElement。
    • 呃,抱歉……我没明白你的意思??我提到 XSD.EXE 会生成一个 XmlElement[],那你在说什么?
    【解决方案3】:

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

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

    【讨论】:

    • 最好总结一下链接的内容,使其成为一个规范的答案,在链接发生时不会中断。
    • @mnel 为什么不自己编辑答案而不是抱怨?
    猜你喜欢
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2011-05-29
    • 2010-09-15
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多