博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XMl 序列化的小问题
阅读量:6471 次
发布时间:2019-06-23

本文共 2830 字,大约阅读时间需要 9 分钟。

hot3.png

Google Earth 中 KML 文件都采用了下面的属性定义

其中第三个名称空间的前缀名为 kml 与当前元素的标签名相同,这样在使用 XPath 语法选择子元素等操作时一直返回为NULL

不知道 Google 最初为社么这样设计的,但在 C# 语言中使用 XmlDocument 的 读取时无法正确读出来。

测试的KML文件如下 :

  
    
      
中牟站
      
#m_ylw-pushpin16
      
        
1
        
          
            
              114.0181288105562,34.70732579930824,0               114.0182028197397,34.70717842472297,0               114.0191556334107,34.70729121976968,0            
          
        
      
    
  

 然后使用 C# 进行选取元素

XmlDocument xml = new XmlDocument();xml.Load(@"D:\Documents\Visual Studio 2013\Projects\WindowsFormsApplication1\WindowsFormsApplication1\中牟站.kml");// XPathXmlNodeList nodes = xml.SelectNodes("/kml/Document/Placemark");

调试下的结果 :

163441_lJqC_559187.png

 

在调试的时候发现使用 FirstChild 和 LastChild 可以正确地访问 根节点  <kml>,但是进入子节点后就不能识别了,表示好郁闷

第一次碰到这个问题的时候不想仔细去想就直接干kml节点了,今天再碰到就表示不能什么都归结于人品问题吧。认真一下就发现这个 xmlns:kml 定义竟然跟节点名称一样, 是XMl的标准不允许这样的语法,还是Google的疏忽?

现在有一个包含复杂元素的类需要序列化

[Serializable]public class Company{ [XmlElement] public int Count { get; set; } [XmlElement] public List
 PersonList { get; set; } [XmlElement] public Person Leader { get; set; }}

可以是序列化后发现有一个小问题

  
5
  
    
MISS DD
    
20
    
Female
    
Left
  
  
    
MR.  DD
    
19
    
Male
    
Right
  
  
    
MRS DDL
    
23
    
Unknow
    
Right
  

第二个属性 PersonList 没有正确地嵌套层次关系,它的子元素直接当作类的属性输出了,是什么原因导致的?仔细实验了一下,原来是属性定义时使用了错误的XML特性声明。

XmlElementAttribute

指示公共字段或属性在 System.Xml.Serialization.XmlSerializer 序列化或反序列化包含它们的对象时表示 XML 元素。

XmlArrayAttribute

指定 System.Xml.Serialization.XmlSerializer 必须将特定的类成员序列化为 XML 元素的数组。

XmlArrayItem

表示指定 System.Xml.Serialization.XmlSerializer 可以放置在序列化数组中的派生类型的特性。

XmlAttribute

指定 System.Xml.Serialization.XmlSerializer 必须将类成员序列化为 XML 特性。

正是由于对这几个特性声明对应的含义不了解导致的错误。本来我们的集合元素 PersonList  应该是 XmlArray 类型的,但是由于代码中指定成了元素,所以就少了一层嵌套。因为没搞明白多加的声明反而画蛇添足了,所以只要去掉或者换成正确的特性声明就会回归正常的输出。

  
5
  
    
      
MISS DD
      
20
      
Female
      
Left
    
    
      
MR.  DD
      
19
      
Male
      
Right
    
  
  
    
MRS DDL
    
23
    
Unknow
    
Right
  

 

 

转载于:https://my.oschina.net/HenuToater/blog/349502

你可能感兴趣的文章
使用openssl进行证书格式转换
查看>>
ZOJ 3777 Problem Arrangement
查看>>
虚拟机类加载机制
查看>>
Callable和Future
查看>>
installshield12如何改变默认安装目录
查看>>
少用数字来作为参数标识含义
查看>>
ScrollView中嵌套ListView
查看>>
JAVA虚拟机05--面试必问之JVM原理
查看>>
Algs4-2.3.1如何切分数组
查看>>
uva 10815 - Andy's First Dictionary(快排、字符串)
查看>>
观察者模式
查看>>
在properties.xml中定义变量,在application.xml中取值问题
查看>>
js 数组
查看>>
Linux scp命令详解
查看>>
struct和typedef struct
查看>>
cell reuse & disposebag
查看>>
【故障处理】ORA-12545: Connect failed because target host or object does not exist
查看>>
云时代,程序员将面临的分化
查看>>
Go的基本示例
查看>>
js判断移动端是否安装某款app的多种方法
查看>>