将XML属性添加到类中的属性

时间:2011-03-17 23:18:59

标签: c# xml-serialization

我需要在具有不同字段名的数据库之间进行同步。我可以将记录从第一个数据库导出到xml文件:

 <Table>
    <Route No="1108">
       <Name No="60">Joe</Name>
       <City No="70">City1</City>
    </Route>
    <Route No="1108">
       <Name No="60">John</Name>
       <City No="70">City2</City>
    </Route>
    <Route No="1108">
       <Name No="60">Jan</Name>
       <City No="70">City4</City>
    </Route>
    <Route No="1108">
       <Name No="60">Jack</Name>
       <City No="70">City6</City>
    </Route>
</Table>

我可以使用元素名称Route-&gt; Name和City将此XML文件序列化到第二个数据库中。

但发回一些数据是问题所在。我已经宣布了这样的课程:

public class Route
{
    [XmlAttribute]
    public string No 
    { 
        get { return "1108"; } 
    }

    public string Name 
    { 
        get { return _Name; } 
        set { _Name = value; } 
    }

    public string City
    {
        get { return _City; }
        set { _City = value; }
    }
}

我可以轻松地在代码中创建它,但是对于100个表来说,这是非常有用的。我想使用de / serialize?

我从没想过这会成为我的表演者。

6 个答案:

答案 0 :(得分:1)

你似乎选择了错误的工具。

这是SQL Server Integration Services(SSIS)的工作。这正是它擅长的。

答案 1 :(得分:1)

John Saunders是对的,XML序列化可能不是这项工作的最佳工具......

现在,如果你仍想这样做,如果你想在NameCity上添加属性,有两种选择:

  • 实现IXmlSerializable接口,使您可以完全控制XML序列化过程。主要的缺点是实施起来很繁琐,特别是如果你必须为很多课程做这件事

  • NameCity制作课程,而不是直接将其表示为字符串。由于所有元素上似乎都有No属性,因此您可以将它们全部从公共基类继承。您可以使用XmlText属性将属性序列化为元素的内容。

    public abstract class EntityWithNumber
    {
        [XmlAttribute("No")]
        public int Number { get; set; }
    }
    
    public class Name : EntityWithNumber
    {
        [XmlText]
        public string Value { get; set; }
    }
    
    public class City : EntityWithNumber
    {
        [XmlText]
        public string Name { get; set; }
    }
    
    public class Route : EntityWithNumber
    {
        public Name Name { get; set; }
        public City City { get; set; }
    }
    

答案 2 :(得分:0)

设置XMLAttribute属性时,只能向root XML元素添加属性。

答案 3 :(得分:0)

实际上我认为你需要完全不同的东西。

从您提供的代码段中,我猜您可以在这样的对象中反序列化:

[Serializable]
[XmlType(AnonymousType=true)]
[XmlRoot(IsNullable=false)]
public partial class Table {

    [XmlElement("Route")]
    public TableRoute[] Items { get; set; }
    }
}

[Serializable]
[XmlType(AnonymousType=true)]
public partial class TableRoute {

    [XmlElement]
    public TableRouteItem[] Name { get; set; }

    [XmlElement]
    public TableRouteItem[] City { get; set; }

    [XmlAttribute]
    public string No { get; set; }
}

[Serializable]
[XmlType(AnonymousType=true)]
public partial class TableRouteItem {

    [XmlAttribute]
    public string No { get; set; }

    [XmlText]
    public string Value { get; set; }
}

您的数据存在的问题是列(或我猜的是列)每个项目的值不止一个。

答案 4 :(得分:0)

阅读并阅读后,我想出了这个。

1。 我添加了自己的属性类?必须有一个更聪明的方式!!

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = true)]
public class XMLAttributeProperty : Attribute
{
    public XMLAttributeProperty(string name, string value)
    {
        this.Name = name;
        Value = value;
    }

    public string Name;
    public string Value;
}

2。 将这些属性添加到类属性

public class Route
{
    [XmlAttribute]
    public string No 
    { 
        get { return "1108"; } 
    }

    **[XMLAttributeProperty("No", "60")]**
    public string Name 
    { 
        get { return _Name; } 
        set { _Name = value; } 
    }

    **[XMLAttributeProperty("No", "70")]**
    public string City
    {
        get { return _City; }
        set { _City = value; }
    }
}

3。 默认情况下,将类序列化为元素..

 <Table>
    <Route No="1108">
       <Name>Joe</Name>
       <City>City1</City>
    </Route>
</Table>

4。 我接管并添加属性。

foreach (var property in trp.GetType().GetProperties()) //class ->typeof(Transport).GetProperties()
{
    foreach (XMLAttributeProperty att in property.GetCustomAttributes(typeof(XMLAttributeProperty), true).Cast<XMLAttributeProperty>())
    {
        Log.Level0(string.Format("Property {0}, {1}={2}", property.Name, att.Name, att.Value));
        var fieldInElement = el.Descendants(property.Name).FirstOrDefault();
        if (fieldInElement != null)
        {
            try
            {
                fieldInElement.Add(new XAttribute(att.Name, att.Value));
            }
            catch { }
        }
    }
}

5。 这是结果。请评论或向我展示更好/更快的方式。我很高兴但是失去了很多时间。

<Table>
    <Route No="1108">
       <Name No="60">Joe</Name>
       <City No="70">City1</City>
    </Route>
</Table>

答案 5 :(得分:0)

这个怎么样?

public class Route
{
    [XmlAttribute("No")]
    public int Number { get {return "1108";} }

    public Name Name { get; set; }
    public City City { get; set; }
}

public class Name
{
    [XmlAttribute("No")]
    public int Number { get {return "60";} }

    [XmlText]
    public string Value { get; set; }
}

public class City
{
    [XmlAttribute("No")]
    public int Number { get {return "70";} }

    [XmlText]
    public string Name { get; set; }
}