Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将XML节点映射到对象';它的特性很容易改变_C#_Xml_Xpath_Mapping - Fatal编程技术网

C# 将XML节点映射到对象';它的特性很容易改变

C# 将XML节点映射到对象';它的特性很容易改变,c#,xml,xpath,mapping,C#,Xml,Xpath,Mapping,从Ruby世界回到XML到散列映射的简易性,我期待着在C#中看到类似的东西 以下是源XML: 我想将其重新映射到具有以下结构的对象: { 服务:{ 姓名:“…” }, 参数:{ 查询字符串:[“…”,“…”] }, Inetnum:{ 链接:{ 类型:“…”, Href:“…” }, 资料来源:{ id:“…” }, PrimaryKey:{ Inetnum:“…” }, 属性:{ Inetnum:“…”, 网络名称:“…”, 描述:“…”, 国家:“……”, 管理员:{ 值:“…”, Re

从Ruby世界回到XML到散列映射的简易性,我期待着在C#中看到类似的东西

以下是源XML:


我想将其重新映射到具有以下结构的对象:

{
服务:{
姓名:“…”
},
参数:{
查询字符串:[“…”,“…”]
},
Inetnum:{
链接:{
类型:“…”,
Href:“…”
},
资料来源:{
id:“…”
},
PrimaryKey:{
Inetnum:“…”
},
属性:{
Inetnum:“…”,
网络名称:“…”,
描述:“…”,
国家:“……”,
管理员:{
值:“…”,
ReferencedType:“…”,
链接:{
类型:“…”,
Href:“…”
}
},
TechC:{
值:“…”,
ReferencedType:“…”,
链接:{
类型:“…”,
Href:“…”
}
},
地位:“……”,
MntBy:{
值:“…”,
ReferencedType:“…”,
链接:{
类型:“…”,
Href:“…”
}
}
备注:“…”,#所有备注节点的串联
资料来源:{
值:“…”,
评论:“……”
}
},
标签:[
{id:“…”}
]
},
人{
链接:{
类型:“…”,
Href:“…”
},
资料来源:{
id:“…”
}
PrimaryKey:{
NicHdl:“…”
},
属性:{
人:“…”,
地址:“…”,#所有地址节点的串联
电话:“…”,
传真号码:“…”,
NicHdl:“…”,
MntBy:{
值:“…”,
ReferencedType:“…”,
链接:{
类型:“…”,
Href:“…”
}
}
备注:“…”,#所有备注节点的串联
资料来源:{
值:“…”,
评论:“……”
}
}
},  
路线:{
链接:{
类型:“…”,
Href:“…”
},
资料来源:{
id:“…”
},
PrimaryKey:{
路线:“…”,
来源:“…”
},
属性:{
路线:“…”,
描述:“…”,
来源:{
值:“…”,
ReferencedType:“…”,
链接:{
类型:“…”,
Href:“…”
}
},
备注:“…”,#所有备注节点的串联
MntBy:{
值:“…”,
ReferencedType:“…”,
链接:{
类型:“…”,
Href:“…”
}
},
资料来源:{
值:“…”,
评论:“……”
}
}
},
条款和条件:{
类型:“…”,
Href:“…”
}
}
要能够调用以下属性:

whois.Inetnum.Attr.Netname
我完全不喜欢通过调用
SelectSingleNode(“xpath”)来检索每个节点

所需的过程是:

  • 定义接收器对象及其所有子对象
  • 定义映射规则
  • 使用单个方法调用解析XML字符串

  • 这里有一个方法

  • 您需要首先添加相关的参考资料(这里有一些):

    使用System.Linq

    使用System.Xml.Linq

    使用System.Text

    使用System.Xml

    使用System.Xml.Serialization

  • 创建将保存反序列化数据的包装器类

    [XmlRoot("root")]
    public class root
    {
        [XmlElement("MyObject")]
        public List<MyObject> A_Object
        {
            get;
            set;
        }
    }
    
    }

  • *注意:如果您有要跟踪但未被反序列化的属性,则可以有没有[XmlElement]的属性

  • 最后,将XML反序列化到对象列表中:
  • public List反序列化xml(字符串xmlPath)
    {
    XmlSerializer反序列化器=新的XmlSerializer(typeof(root));
    List objectList=新列表();
    尝试
    {
    使用(文本)
    
    [XmlElement("type")] //from your sample code route,person all go here
    public string objType
    {
        get;
        set;
    }
    [XmlElement("address")]
    public string personAddr
    {
        get;
        set;
    }
    [XmlElement("phone")]
    public string personPhone
    {
        get;
        set;
    }