本次为了记录开发一个基于webservice接口,去解析对方传送过来的xml字符串。实际使用时遇到的一些问题。
传输过来的xml格式大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<? 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 > |
- xmlns 是默认的命名空间,在有命名空间情况下,需要使用XmlNamespaceManager进行处理。
- xmlns:xsi 定义了一个命名空间前缀 xsi 对应的唯一字符串 www.w3.org/2001/XMLSch… ,而且这个 xmlns:xsi 在不同的 xml 文档中似乎都会出现。 这是因为 xsi 已经成为了一个业界默认的用于 XSD(XML Schema Definition) 文件的命名空间。 而 XSD 文件(也常常称为 Schema 文件)是用来定义 xml 文档结构的。
XML 解析器可以根据 一个 XSD 文件的内容来解析另一个 XML 文件, 判断该文件的结构 是否和 XSD 文件中定义的一致。 XSD 文件 可以理解为 XML 文档可以自定义的语法或格式检查器。
- xsi:schemaLocation 是一个由空格分开的键值对,前一个 键 www.test.com/hit/rhin 是命名空间, 是一个全局唯一字符串。后一个 值 是XSD location URI , 这个值指示了前一个命名空间所对应的 XSD 文件的位置, xml parser 可以利用这个信息获取到 XSD 文件, 从而通过 XSD 文件对所有属于 命名空间 www.test.com/hit/rhin 的元素结构进行校验, 因此这个值必然是可以访问的, 且访问到的内容是一个 XSD 文件的内容
具体实现代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//读取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实体上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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; } |
实体定义也需要说明命名空间
1
2
3
4
5
6
7
|
[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 ; } } |
以上就是C# 解析XML和反序列化的示例的详细内容,更多关于C# 解析XML和反序列化的资料请关注服务器之家其它相关文章!
原文链接:https://juejin.cn/post/6956445778579554311