如何读取现有SOAP XML消息?如何编写rootClass代码?
读取SOAP格式ExamCard文件及定义rootClass的方法
一、读取SOAP文件的实用方式
直接处理完整SOAP Envelope会增加不必要的代码复杂度,更高效的做法是跳过外层SOAP结构,直接定位到核心的ExamCard节点进行反序列化:
using System.Xml; using System.Xml.Serialization; // 加载目标XML文件 XmlDocument doc = new XmlDocument(); doc.Load("PHANTOM_QT1_SLU_20151230.ExamCard"); // 配置命名空间管理器,匹配XML中的命名空间 XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable); nsMgr.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/"); nsMgr.AddNamespace("a1", "http://schemas.microsoft.com/clr/nsassem/Philips.PmsMR.ExamCards.ECModel/philips.pmsmr.examcards.ecmodel_cs"); // 定位到Body下的ExamCard节点 XmlNode examCardNode = doc.SelectSingleNode("//soapenv:Body/a1:ExamCard", nsMgr); // 反序列化节点为目标对象 XmlSerializer serializer = new XmlSerializer(typeof(ExamCard)); using (XmlNodeReader reader = new XmlNodeReader(examCardNode)) { ExamCard myObject = (ExamCard)serializer.Deserialize(reader); }
二、编写rootClass(ExamCard类)
需要严格匹配XML的命名空间、节点名和属性,通过XML序列化特性完成映射:
using System.Xml.Serialization; // 匹配XML中的命名空间和根节点名 [XmlRoot(Namespace = "http://schemas.microsoft.com/clr/nsassem/Philips.PmsMR.ExamCards.ECModel/philips.pmsmr.examcards.ecmodel_cs", ElementName = "ExamCard")] public class ExamCard { // 映射XML中的id属性 [XmlAttribute("id")] public string Id { get; set; } // 根据XML实际结构补充其他属性,示例如下: // [XmlElement("PatientID")] // public string PatientID { get; set; } // 嵌套复杂类型需单独定义类并添加对应特性 }
关键注意事项
- 命名空间必须与XML中
a1前缀对应的命名空间完全一致,否则反序列化会失败 - 若不清楚XML完整结构,可使用Visual Studio的「编辑→选择性粘贴→将XML粘贴为类」功能,快速生成匹配的类结构
- 嵌套节点或集合类型需单独编写对应类,并添加
XmlElement或XmlArray等特性
内容的提问来源于stack exchange,提问作者malat
相关产品推荐
相关产品推荐

