Добавление атрибута XML к свойствам в классе - PullRequest
0 голосов
/ 18 марта 2011

Мне нужно синхронизировать базы данных с разными именами полей.Я могу экспортировать записи в 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>

Я могу сериализовать этот XML-файл во вторую базу данных, используя имена элементов Route-> Name and City.

Но отправить некоторые данные обратно это проблема.Я объявил класс следующим образом:

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 ]

1 голос
/ 18 марта 2011

Джон Сондерс прав, сериализация XML, вероятно, не лучший инструмент для работы ...

Теперь, если вы все еще хотите пойти по этому пути, есть два варианта, если вы хотите добавить атрибуты для Name и City:

  • Реализация интерфейса IXmlSerializable, который дает вам полный контроль над процессом сериализации XML. Основным недостатком является трудоемкость реализации, особенно если вы должны сделать это для многих классов

  • Создайте классы для Name и City, а не представляйте их непосредственно в виде строк. Поскольку кажется, что атрибут 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; }
    }
    
1 голос
/ 18 марта 2011

Вы, кажется, выбрали неправильный инструмент для работы.

Это задание для служб интеграции SQL Server (SSIS). Это именно то, в чем оно хорошо.

0 голосов
/ 18 марта 2011

Как насчет этого?

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; }
}

0 голосов
/ 18 марта 2011

После прочтения и чтения я придумал это.

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>
0 голосов
/ 18 марта 2011

На самом деле я думаю, что вам нужно что-то совсем другое.

Из предоставленного вами фрагмента, я думаю, вы могли бы десериализовать в объекте, подобном этому:

[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; }
}

Проблема с вашими даннымичто столбцы (или, как мне кажется, столбцы) имеют более одного значения на элемент.

0 голосов
/ 18 марта 2011

При настройке атрибута XMLAttribute вы можете добавить атрибут только к корневому элементу XML.

...