0

这个问题比标题所暗示的要具体一些。我尝试了几种方法,希望将请求 XML 反序列化为一个对象,但没有任何问题。请继续阅读,请为我提出一些想法供我研究。

问题:

我收到一个 HL7 格式的 POST 卡住了。这大约是一个 55k 的帖子,其中包含大约 200 字节的有用信息。我只需要提取那几个字节。通常,这将只有大约 30 个字节,具体取决于发送给我的跟踪号码的数量。不,我对改变这一点没有任何发言权。

这个 HL7 数据是标准的 XML 格式,除了很多 Attributes 用来承载数据,而不是 Elements。同样,我似乎被发件人以这种方式卡住了。(我的偏好和 Web 服务经验是标准的 MS Soap/WSDL 设置。)

我已经使用 XSD.exe 创建了一个包含反序列化数据的类(来自将发送给我的一些示例 XML。),但是,XSD 似乎将所有属性转换为元素。当我查看生成的 WCF 服务页面时,我看不到与我收到的内容相似的 xml。这种差异似乎阻止了 HL7 请求的反序列化?请参阅以下缩写示例:
缩写入站请求示例(因为处理 55k 样本让我很头疼),只是前几行:

<?xml version="1.0" encoding="utf-8"?>
<QUQI_IN300102XXX xmlns="urn:hl7-org:v3" ITSVersion="XML_1.0">
  <realmCode code="XXX" />
  <id extension="XX011111" />
  <creationTime value="20121220133424-0500" />
  <responseModeCode code="IMMEDIATE" />
  <versionCode code="V3-2010-12" />
  <interactionId extension="QUQI_IN300102XXX" />
  <processingCode code="P" />
  <processingModeCode code="T" />
  <acceptAckCode code="NE" />
  <receiver typeCode="RCV">
    <realmCode code="XXX" />
    <device>
      <realmCode code="XXX" />
      <id extension="XXXIB" assigningAuthorityName="Service" />
    </device>
  </receiver>
  <sender typeCode="SND">
    <realmCode code="XXX" />
    <device>
      <realmCode code="XXX" />
      <id assigningAuthorityName="CCC" />
    </device>
  </sender>
  <controlActEvent>
    <realmCode code="XXX" />
    <id extension="Tracking" assigningAuthorityName="TRANSTYPE" />
    <code code="Order" />
    <statusCode />
    <queryByParameter>
      <realmCode code="XXX" />
      <queryId extension="NJ011111A-20121220133343" />
      <parameterList>
        <realmCode code="XXX" />
        <accessionNum>
          <value extension="NJ011111A" />
        </accessionNum>
        <batchNumber>
          <value extension="120927001" assigningAuthorityName="ZZ1" />
          <value extension="120927002" assigningAuthorityName="ZZ1" />
        </batchNumber>



“batchNumber”是我需要从入站请求中获取的主要数据。
如果我查看“WCF 项目”服务帮助页面(如果我没记错的话,是使用 WCF REST 项目类型 nuget 包创建的),我得到:

<QUQI_IN300102QD>
  <realmCode>
<realmCode>
  <code>String content</code>
</realmCode>
<realmCode>
  <code>String content</code>
</realmCode>
  </realmCode>
  <id>
<id>
  <extension>String content</extension>
  <assigningAuthorityName>String content</assigningAuthorityName>
</id>
<id>
  <extension>String content</extension>
  <assigningAuthorityName>String content</assigningAuthorityName>
</id>
  </id>
  <creationTime>
    <QUQI_IN300102QDCreationTime>
  <value>String content</value>
   </QUQI_IN300102QDCreationTime>
  <QUQI_IN300102QDCreationTime>
    <value>String content</value>
   </QUQI_IN300102QDCreationTime>
  </creationTime>



现在,我输入 XSD.exe 的 XML 看起来不像服务页面发出的那样,并且无论出于何种原因,当我传入 post 请求时,它不会反序列化。

我希望这些信息足以描述我的问题。

对于解决方案,我的最佳选择是什么?
创建一个 MVC 项目并接受一个 XMLDoc 作为 post 数据类型,并进行 XML 操作以获得我需要的东西?还是其他选择?
仅供参考,返回数据必须在某个时候插入到 XML 中,但我还没有做到这一点。

仅供参考,我创建 Web 服务的经验仅限于 VS。你知道,文件、新项目、Web 服务。然后将代理添加到消费项目中的 WSDL 页面并使用该事物。当然,第三个项目只包含供其他两个项目引用的类对象,以及一些数据访问项目。

使用 Fiddler 编写我的请求,并且我打开了 WCF 跟踪。
我从跟踪中得到的是:

无法使用 XmlSerializer 反序列化具有根名称“Binary”和根命名空间“”的 XML 正文(用于操作“methodTrackQLSBatch”和合同(“ShipmentTracking”,“ http://tempuri.org/ ”))。确保将 XML 对应的类型添加到服务的已知类型集合中。

它确实知道类型。如果我改变一切以使用一段非常简单的 XML,它会完美地反序列化。

提前感谢您的任何想法。

我想简单地说,我怎样才能接受这个大的 HL7 请求,从中提取数据,将结果插入其中,然后返回呢?(我大概能算出“退货”的部分,呵呵。虽然你永远不知道。)

4

1 回答 1

1

听起来在这种情况下反序列化 XML 不会有太大的收获。如果您只对少量数据感兴趣,最后只想修改 XML 并将其返回,则只需使用Linq to XML 读取和操作 XML。(例如XDocument,XElement等)

于 2013-02-01T20:49:50.163 回答