2013-07-15 167 views
1

我承认在这里学习,并在序列化和反序列化xml方面取得了进展。反序列化xml元素属性

我的问题是,如何在下面的XML中访问URI

<address href="/api/juniper/sd/address-management/addresses/98677" 
uri="/api/juniper/sd/address-management/addresses/98677"> 
    <name>Any-IPv4</name> 
    <address-type>ANY_IPV4</address-type> 
    <description>Predefined any-ipv4 address</description> 
    <host-name /> 
    <id>98677</id> 
</address> 

真的不知道如何在我的课中设置它来反序列化它吗?

我班现在的样子:

[XmlRoot("address", Namespace = "")] 
public class address 
{ 
    string _name; 
    string _editVersion; 
    string _addressType; 
    string _ipAddress; 
    string _description; 
    string _hostName; 
    string _zone; 
    string _addressVersion; 
    string _definitionType; 
    string _createdByUserName; 
    string _lastModifiedByUser; 
    string _createdTime; 
    string _lastModifiedTime; 
    string _id; 

    [XmlElement(ElementName = "name")] 
    public string name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 
    [XmlElement(ElementName = "edit-version")] 
    public string editversion 
    { 
     get { return _editVersion; } 
     set { _editVersion = value; } 
    } 
    [XmlElement(ElementName = "address-type")] 
    public string addresstype 
    { 
     get { return _addressType; } 
     set { _addressType = value; } 
    } 
    [XmlElement(ElementName = "ip-address")] 
    public string ipaddress 
    { 
     get { return _ipAddress; } 
     set { _ipAddress = value; } 
    } 
    [XmlElement(ElementName = "description")] 
    public string description 
    { 
     get { return _description; } 
     set { _description = value; } 
    } 
    [XmlElement(ElementName = "host-name")] 
    public string hostname 
    { 
     get { return _hostName; } 
     set { _hostName = value; } 
    } 
} 

提前感谢!

+0

使用[XmlAttribute](http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeattribute.aspx)属性。看看[这个SO条目](http://stackoverflow.com/questions/11330643/serialize-property-as-xml-attribute-in-element)。 – pasty

回答

2

如果你想拥有它的序列化作为System.Uri使用XmlAttributeAttribute属性*

[XmlAttribute] 
public string uri 
{ 
    get { return _uri; } 
    set { _uri = value; } 
} 

,你将有一个单独的属性为Uri做到这一点是不可序列。

[XmlAttribute("uri")] 
public string SerializedUri 
{ 
    get 
    { 
     return uri.ToString(); 
    } 
    set 
    { 
     uri = new Uri(value, UriKind.RelativeOrAbsolute); 
    } 
} 

[XmlIgnore] 
public Uri uri { get; set; } 

有了这个用法,在代码,你会读/写,直接向Uri uri属性而忽略SerializedUri财产。当通过序列化器时,它将忽略该属性,而是使用SerializedProperty,然后手动序列化/反序列化Uri uri属性。

*(说的3倍快)

+0

谢谢克里斯,我会给你一个镜头。有没有办法阻止它的序列化,并且只在反序列化时才适用? –

+0

对不起特拉维斯,我不确定我是否理解。你的意思是你想从XML中读取“uri”值,但是如果你要序列化/输出XML,你不希望写入“uri”属性? –

+0

如果是这样的话,一个_quick hack_会让'SerializedUri' get方法返回null而不是:'public string SerializedUri \t {get {return null; } set {uri = new Uri(value,UriKind.RelativeOrAbsolute); }}。 'XmlSerializer'省略了任何'null'值,并且不包含该属性;但是当读取任何现有的/传统的uri属性时,setter仍然会执行。 –