Вставка и обновление промежутки времени в XML


Мне нужна помощь, чтобы рефакторинг мой код. Я обычно имел трудное время, выясняя, как сделать мой многоразовый код.

У меня есть XML-файл, которые содержат данные для каждого элемента тега. Элемент тег должен иметь дочерние узлы LastClocked, и TotalClocked. Я сначала думал о создании тега Object и сделать сериализацию. Но, я нашел LINQ для XML гораздо легче. Я бы очень признательны, если вы скажете мне, что улучшить в моем коде.

namespace StopWatch.Models
{
    public class TagCollection
    {
        private XElement doc;
        private IEnumerable<XElement> tagElements;

        public TagCollection()
        {
            if(File.Exists("TagsData.xml"))
            {
               doc = XElement.Load("TagsData.xml");
            }
            else
            {
                //TODO: Create XML
            }
        }

        public void Save(TimeSpan clocked, string tags)
        {
            tagElements = from t in doc.Elements("Tag")
                          where (string)t.Attribute("Name") == tags
                          select t;

            TimeSpan lastClocked = TimeSpan.Parse((string)
                                   (from lc in tagElements.Descendants("LastClocked")
                                    select lc).First());

            lastClocked = lastClocked.Add(clocked);

            if (!tagElements.Any())
            {
                Insert(clocked, tags);
            }
            else
            {
                Update(clocked, lastClocked);
            }

            doc.Save("TagsData.xml");
        }

        private void Update(TimeSpan clocked, TimeSpan lastClocked) 
        {
            foreach(XElement tagElement in tagElements)
            {
                tagElement.SetElementValue("LastClocked", clocked.ToString());
                tagElement.SetElementValue("TotalClocked", lastClocked.ToString());
            }
        }

        private void Insert(TimeSpan clocked, string tags) 
        {
            XElement newTag = new XElement("Tag",
                                    new XAttribute("Name", tags),
                                    new XElement("LastClocked", clocked.ToString()),
                                    new XElement("TotalClocked", clocked.ToString()));

            doc.Add(newTag);
        }
    }
}


410
3
задан 13 февраля 2011 в 03:02 Источник Поделиться
Комментарии
1 ответ

Ваш код, кажется, очень процессуально - ты волнуешься о внедрении, как все будет сделано, прежде чем вы думаете о том, что эти вещи и как вы хотите их использовать. У вас нет никаких свойств, просто методы, которые мне не особо нравятся.

Насколько я понимаю, вы хотите написать программу-оболочку, многоразовые из некоторые XML, который поместится в согласованном формате. У вас есть класс, который представляет этот объект?

public TagElement
{
private XElement tagXml
public string Name
public DateTime LastClocked
public DateTime TotalClocked
}

Сейчас я бы просто сделать каждому из этих свойств указывают на объект частная XML получить / установить их значения.

public TagElement(string name, DateTime initialValue)
{
tagXml = new XElement("Tag",
new XAttribute("Name", name),
new XElement("LastClocked", initialValue),
new XElement("TotalClocked", initialValue));
}

public DateTime LastClocked
{
get
{
return tagXml.Descendents("LastClocked").Single().Value;
}
set
{
tagXml.Descendents("LastClocked").Single() = value;
}
}

Вы можете еще сохранить метод, который сохраняет XElement к файлу. Вы наверное также хотите, чтобы класс, коллекция, включающий отдельные TagElements.

public TagCollection
{
public List<TagElement> TagElements { get; set; }
}

Тогда вы можете использовать

var collection = new TagCollection("myFile.xml");
// constructor for TagCollection needs to parse the XML, and create TagElements

var fooElement = collection.TagElements.Single(tag => tag.Name == "foo");
fooElement.LastClocked = DateTime.Now;

collection.TagElements.ForEach(tag => tag.TotalClocked = DateTime.Now);

В резюме, предпочитают использовать свойства для получения и установки значений, чем при использовании методов. Абстрагироваться XML таким образом, что, когда вы используете класс вы не знаете или заботитесь, что он сохраняется в XML.

5
ответ дан 13 февраля 2011 в 07:02 Источник Поделиться