首页 新闻 会员 周边

复杂 XML 的序列化反序列化,XML 层级太多,无法反序列化

0
悬赏园豆:5 [已关闭问题] 关闭于 2014-09-08 18:57
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?xml version="1.0" encoding="utf-8" ?>
<config>
  <rules>
    <rule name="namea">
      <params>
        <item name="p" type="get" pattern="(ios|android|)" />
        <item name="cid" type="get" pattern="(ios|android|)" />
        <item name="type" type="get" pattern="(ios|android|)" />
        <item name="sort" type="get" pattern="(ios|android|)" />
        <item name="action" type="post" pattern="(ios|android|)" />
        <item name="userAgent" type="header" pattern="(ios|android|)" />
      </params>
    </rule>
 
    <rule name="nameb">
      <params>
        <item name="p" type="get" pattern="(ios|android|)" />
        <item name="cid" type="get" pattern="(ios|android|)" />
        <item name="type" type="get" pattern="(ios|android|)" />
        <item name="sort" type="get" pattern="(ios|android|)" />
        <item name="action" type="post" pattern="(ios|android|)" />
        <item name="userAgent" type="header" pattern="(ios|android|)" />
      </params>
    </rule>
 
    <rule name="namec">
      <params>
        <item name="p" type="get" pattern="(ios|android|)" />
        <item name="cid" type="get" pattern="(ios|android|)" />
        <item name="type" type="get" pattern="(ios|android|)" />
        <item name="sort" type="get" pattern="(ios|android|)" />
        <item name="action" type="post" pattern="(ios|android|)" />
        <item name="userAgent" type="header" pattern="(ios|android|)" />
      </params>
    </rule>
 
    <rule name="named">
      <params>
        <item name="p" type="get" pattern="(ios|android|)" />
        <item name="cid" type="get" pattern="(ios|android|)" />
        <item name="type" type="get" pattern="(ios|android|)" />
        <item name="sort" type="get" pattern="(ios|android|)" />
        <item name="action" type="post" pattern="(ios|android|)" />
        <item name="userAgent" type="header" pattern="(ios|android|)" />
      </params>
    </rule>
  </rules>
</config>

 

问下,如何反序列化 参数 /config/rules/rule/params/item  ?

fun5的主页 fun5 | 初学一级 | 园豆:4
提问于:2014-08-24 21:45
< >
分享
所有回答(1)
0

不明白你的这个序列化何来的复杂之说。能具体描述吗?至于 小尧弟 说的什么遵循什么最小单元到不必在意。

519740105 | 园豆:5810 (大侠五级) | 2014-08-25 08:47

我写了几个类,对应xml 的每个节点 最终发现无法序列化出   class rule 的  public List<paramsItem> @params{get;set;}   ,一直是null

public class config
{
    [XmlArray("rules")]
    public List<rule> rules{get;set;}
}



[XmlType(TypeName="item",Namespace="/config/rules/rule")]
public class rule
{
    [XmlElement("name")]
    public string name{get;set;}
    
    [XmlArray("params")]
    public List<paramsItem> @params{get;set;}
}


[XmlType(TypeName="item",Namespace="/config/rules/rule/params/item")]
public class paramsItem
{
    public string name{get;set;}
    public string type{get;set;}
    public string pattern{get;set;}
}

 

 

支持(0) 反对(0) fun5 | 园豆:4 (初学一级) | 2014-08-25 09:17

@foxidea: 

代码:

public class config
{
    [XmlArray("rules")]
    public List<rule> rules{get;set;}
}

对应的xml是:

<config>

    <rules>

    </rules>

    <rules>

    </rules>

</config>

按照你的完整代码,会生成xml:

<config>
    <rules>
        <name>...</name>
        <params>
            <name>...</name>
            <type>...</type>
            <pattern>...</pattern>
        </params>
        <params>
            <name>...</name>
            <type>...</type>
            <pattern>...</pattern>
        </params>
        <params>
            <name>...</name>
            <type>...</type>
            <pattern>...</pattern>
        </params>
    </rules>
    <rules>
        <name>...</name>
        <params>
            <name>...</name>
            <type>...</type>
            <pattern>...</pattern>
        </params>
        <params>
            <name>...</name>
            <type>...</type>
            <pattern>...</pattern>
        </params>
        <params>
            <name>...</name>
            <type>...</type>
            <pattern>...</pattern>
        </params>
    </rules>
    <rules>
        <name>...</name>
        <params>
            <name>...</name>
            <type>...</type>
            <pattern>...</pattern>
        </params>
        <params>
            <name>...</name>
            <type>...</type>
            <pattern>...</pattern>
        </params>
        <params>
            <name>...</name>
            <type>...</type>
            <pattern>...</pattern>
        </params>
    </rules>
</config>


以上代码的生成可能跟实际会有所出入,你可以先生成config对象,然后序列化为xml,比较生成的xml与要读取的xml之间的差异,然后去调整类的结构。

 

xml的属性需要使用XmlAttribute特性定义。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-25 09:24

@foxidea: 另外,namespace是用于定义名称空间的,不是用来定义xml路径的。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-25 09:26

@foxidea: 抱歉,我前面的猜测有意外,下面是我处理后的代码:

    [XmlType(TypeName = "config")]
    public class XmlConfig
    {
        [XmlArray("rules")]
        public List<rule> rules { get; set; }
    }



    [XmlType(TypeName = "rule")]
    public class rule
    {
        [XmlAttribute]
        public string name { get; set; }

        [XmlArray("params")]
        public List<paramsItem> @params { get; set; }
    }


    [XmlType(TypeName = "item")]
    public class paramsItem
    {
        [XmlAttribute]
        public string name { get; set; }
        [XmlAttribute]
        public string type { get; set; }
        [XmlAttribute]
        public string pattern { get; set; }
    }
支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-25 09:59

@小尧弟: 呵呵,理解就好了。楼主给的xml是内容为空的xml,<a />等同于<a></a>,当属性很多又是简单结构的时候,使用属性的可读性比使用子节点的可读性要强,而且,从性能来说,也有小小的提高,还少占用空间(xml字符串的总字节数少)。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-25 22:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册