本次为了记录开发一个基于webservice接口,去解析对方传送过来的xml字符串。实际使用时遇到的一些问题。
传输过来的xml格式大致如下:
<?xml version="1.0" encoding="UTF-8"?> <messages xmlns="http://www.test.com/hit/rhin" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com/hit/rhin file:///e:/request_message.xsd"> <heartbeat/> <switchset></switchset> <business> <datasets> <setdetails> <WS02_01>内容</WS02_01> </setdetails> <setdetails> <WS02_01>内容</WS02_01> </setdetails> </datasets> </business> </messages>
XML 解析器可以根据 一个 XSD 文件的内容来解析另一个 XML 文件, 判断该文件的结构 是否和 XSD 文件中定义的一致。 XSD 文件 可以理解为 XML 文档可以自定义的语法或格式检查器。
具体实现代码:
//读取xml XmlDocument xml = new XmlDocument(); xml.LoadXml(XMLData); //命名空间处理 XmlNamespaceManager m = new XmlNamespaceManager(xml.NameTable); m.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); m.AddNamespace("d", "http://www.test.com/hit/rhin"); //d是随意的一个命名 //读取数据节点,需要带上命名空间m XmlNodeList dataNodeList = xml.SelectNodes("d:messages/d:business/d:datasets/d:setdetails", m); if (dataNodeList != null && dataNodeList.Count > 0) { for (int i = 0; i < dataNodeList.Count; i++) { var model = XmlToEntity<TestModel>(dataNodeList[i].OuterXml,"http://www.test.com/hit/rhin"); } }
XmlToEntity方法 将xml反序列化到Model实体上。
privated T XmlToEntity<T>(string xml, string nameSpace) { T obj = default(T); try { XmlRootAttribute root = new XmlRootAttribute("setdetails"); root.Namespace = nameSpace;//带命名空间的操作 XmlSerializer serializer = new XmlSerializer(typeof(T),root); StringReader sr = new StringReader(xml); obj = (T)serializer.Deserialize(sr); sr.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } return obj; }
实体定义也需要说明命名空间
[XmlRoot(Namespace = "http://www.test.com/hit/rhin", IsNullable = false, ElementName = "setdetails")] [Table("TAB_TEST")] public class TestModel { [XmlElement("WS02_01")] public string NEIRONG { get; set; } }