这个问题比标题所示的更具体。 我已经尝试了几种方法,希望将请求XML反序列化为一个对象,只有问题。继续阅读,请为我提出一些建议供我调查。
问题:
我很难接受HL7格式的POST。这大约是一个55k的帖子,其中包含大约200字节的有用信息。我只需要提取那几个字节。通常,这只会是大约30个字节,具体取决于向我发送了多少跟踪号码。不,我在改变这个方面没有任何发言权。
这个HL7数据采用标准XML格式,但许多属性用于传输数据,而不是元素。再一次,我似乎被发送者这样做了。 (我的偏好和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跟踪。
我从跟踪中得到的是:
无法反序列化XML主体与根名称 '二进制' 和根名称空间 ''(操作 'methodTrackQLSBatch' 和合同( 'ShipmentTracking', 'http://tempuri.org/')),使用XmlSerializer的。确保将与XML对应的类型添加到服务的已知类型集合中。
它知道类型。如果我改变一切以使用一个非常简单的XML,它会完美地反序列化。
提前感谢您的任何想法。
我想简洁地说,我怎么能接受这个大的HL7请求,从中提取数据,将结果插入其中,然后返回它? (我可以想出“返回它”部分,嘿。虽然你永远不知道。)
答案 0 :(得分:1)
听起来你在这种情况下反序列化XML不会有太大的影响。如果您只对少量数据感兴趣,最后您只想修改XML并将其返回,只需使用Linq to XML读取和操作XML即可。 (例如XDocument
,XElement
等)