【发布时间】:2021-10-06 05:37:07
【问题描述】:
我需要使用 C# 来处理来自服务的响应,然后再将其交给调用者。该服务接受一系列 XML 格式的请求,格式化消息并将其发送到服务。响应类似于:
<SvcRes>
<SvcVer>1.0</SvcVer>
<MsgUUID>12345678-1234-1234-1234-123456789012</MsgUUID>
<Svc>
<SvcParms>
<ApplID>App</ApplID>
<SvcID>AppSrch</SvcID>
<SvcVer>1.0</SvcVer>
</SvcParms>
<MsgData>
<AppResData>
<Key>xxxxxxxx</Key>
<Rslt>xxxxxxxx</Rslt>
<ErrCde>0</ErrCde>
<ApplMsgLst>
<ApplMsg>
<ApplMsgApplId>D6</ApplMsgApplId>
<ApplMsgNbr>0</ApplMsgNbr>
<ApplMsgTxt>INQUIRY COMPLETE 09:23:53</ApplMsgTxt>
<ApplMsgErrInd>N</ApplMsgErrInd>
</ApplMsg>
</ApplMsgLst>
</AppResData>
</MsgData>
<ErrCde>0</ErrCde>
<ErrMsg/>
</Svc>
<Svc>
<SvcParms>
<ApplID>DP</ApplID>
<SvcID>DPKywrd</SvcID>
<SvcVer>1.0</SvcVer>
<RqstUUID>12345678-1234-1234-1234-123456789012</RqstUUID>
</SvcParms>
<MsgData>
<AppResData>
<Key>xxxxxxxx</Key>
<Rslt>xxxxxxxx</Rslt>
<ErrCde>0</ErrCde>
<ApplMsgLst>
<ApplMsg>
<ApplMsgApplId>D6</ApplMsgApplId>
<ApplMsgNbr>0</ApplMsgNbr>
<ApplMsgTxt>INQUIRY COMPLETE 09:23:53</ApplMsgTxt>
<ApplMsgErrInd>N</ApplMsgErrInd>
</ApplMsg>
</ApplMsgLst>
</AppResData>
</MsgData>
<ErrCde>0</ErrCde>
<ErrMsg/>
<Svc>
<ErrCde>0</ErrCde>
<ErrMsg>Success</ErrMsg>
</SvcRes>
我需要提取 AppResData 节点,然后从每个节点中提取 ApplMsgLst 节点,然后再将结果发送回调用方。生成的 XML 应该是这样的:
<AppResData>
<Key>xxxxxxxx</Key>
<Rslt>xxxxxxxx</Rslt>
<ErrCde>0</ErrCde>
</AppResData>
<AppResData>
<Key>xxxxxxxx</Key>
<Rslt>xxxxxxxx</Rslt>
<ErrCde>0</ErrCde>
</AppResData>
我可以使用以下 2 行代码获取 XElement 节点列表:
var xml = XElement.Parse(xmlResponse);
var msgData = xml.DescendantsAndSelf("MsgData");
- 然后我可以执行 string.Concat(msgData.Nodes()) 以获取最终字符串以返回给调用者 - 但此时我不知道如何删除内部 ApplMsgLst 节点。我尝试将其转换回字符串并重新解析,但它当然会抱怨多个根元素。我已经尝试了所有我能想到的 Remove 组合,但它们总是删除太多(全部)或什么都不删除..
还有其他方法可以做到这一点吗?没有文件,这是 SOAP Web 服务中的所有字符串数据。
【问题讨论】:
-
这个任务最好使用 XSLT。我希望您想要的输出格式正确,包含根节点。