【问题标题】:Deserialize xml element attributes反序列化 xml 元素属性
【发布时间】:2013-07-15 21:23:08
【问题描述】:

我承认在这里学习,并且在序列化和反序列化 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; }
    }
}

提前致谢!

【问题讨论】:

标签: c# xml deserialization


【解决方案1】:

使用XmlAttributeAttribute 属性*

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

如果您想让它序列化为System.Uri,则必须使用单独的属性来完成,因为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 倍)

【讨论】:

  • 谢谢克里斯,我会试一试。有没有办法防止它被序列化,并且只在反序列化期间应用?
  • 对不起,特拉维斯,我不确定我是否理解。您的意思是您想读取 XML 中的“uri”值,但是如果您要序列化/输出 XML,您是否不希望写入“uri”属性?
  • 如果是这种情况,快速破解将是让SerializedUri get 方法返回 null:public string SerializedUri { get { return null; } set { uri = new Uri(value, UriKind.RelativeOrAbsolute); } }。 XmlSerializer 省略任何 null 值并且不包含该属性;但是,当读取任何现有/旧 uri 属性时,setter 仍将执行。
  • 这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
相关资源
最近更新 更多