I'm not going to explain the purpose of the code provided below. If you do not understand it, i know that i have to improve it (naming, structure etc.).
I would like to know how to improve this code in terms of readability and complexity.
Data structure:
<?xml version="1.0" encoding="utf-8"?>
<QuoteApp>
<Authors>
<Author>
<AuthorId>1</AuthorId>
<Firstname>William</Firstname>
<Lastname>Shakespeare</Lastname>
<Profession>englischer Dramatiker, Lyriker und Schauspieler</Profession>
<DayOfBirth>Sonntag, 26. April 1564</DayOfBirth>
<DayOfDeath>Dienstag, 3. Mai 1616</DayOfDeath>
<Image>/Data/Images/Author1.jpg</Image>
</Author>
<Author>
<AuthorId>2</AuthorId>
<Firstname>Friedrich</Firstname>
<Lastname>Nietzsche</Lastname>
<Profession>deutscher Philologe und Philosoph</Profession>
<DayOfBirth>Dienstag, 15. Oktober 1844</DayOfBirth>
<DayOfDeath>Samstag, 25. August 1900</DayOfDeath>
<Image>/Data/Images/Author2.jpg</Image>
</Author>
</Authors>
<Quotes>
<Quote>
<QuoteId>1</QuoteId>
<Text>qwerty</Text>
</Quote>
<Quote>
<QuoteId>2</QuoteId>
<Text>qwerty</Text>
</Quote>
</Quotes>
</QuoteApp>
Entry Point:
private void SaveAuthor()
{
var xmlFileHandler = new XmlFileHandler();
//xmlFileHandler.CreateXmlFile();
xmlFileHandler.AddAuthor(new Author(1, "William", "Shakespeare", "englischer Dramatiker, Lyriker und Schauspieler",
new DateTime(1564, 04, 26), new DateTime(1616, 05, 3)));
xmlFileHandler.AddAuthor(new Author(2, "Friedrich", "Nietzsche", "deutscher Philologe und Philosoph",
new DateTime(1844, 10, 15), new DateTime(1900, 08, 25)));
}
XmlFileHandler class
public class XmlFileHandler
{
private const string FileName = "quotes.xml";
private const string AuthorsNodeName = "Authors";
public bool AddAuthor(Author author)
{
var xmlQuotes = XDocument.Load(FileName);
var authorExists = CheckIfAuthorAlreadyExists(author.AuthorId, xmlQuotes);
if (!authorExists)
{
this.AddAuthorToXmlDocument(author, xmlQuotes);
return true;
}
return false;
}
private void AddAuthorToXmlDocument(Author author, XDocument xmlQuotes)
{
var authorsNode = xmlQuotes.Descendants(AuthorsNodeName).FirstOrDefault();
if (authorsNode != null) authorsNode.Add(this.CreateAuthorXmlNode(author));
xmlQuotes.Save(FileName);
}
private bool CheckIfAuthorAlreadyExists(int authorId, XDocument xmlQuotes)
{
var xmlAuthorList = xmlQuotes.Descendants(AuthorsNodeName).Descendants("Author");
IEnumerable<XElement> xElements = from xmlAuthor in xmlAuthorList
let xElement = xmlAuthor.Element("AuthorId")
where xElement != null && xElement.Value == authorId.ToString(CultureInfo.InvariantCulture)
select xmlAuthor;
if (xElements.Any())
{
return true;
}
return false;
}
private XElement CreateAuthorXmlNode(Author author)
{
var xmlAuthor = new XElement("Author");
xmlAuthor.Add(new XElement("AuthorId") { Value = author.AuthorId.ToString(CultureInfo.InvariantCulture) });
xmlAuthor.Add(new XElement("Firstname") { Value = author.Firstname });
xmlAuthor.Add(new XElement("Lastname") { Value = author.Lastname });
xmlAuthor.Add(new XElement("Profession") { Value = author.Profession });
xmlAuthor.Add(new XElement("DayOfBirth") { Value = author.DayOfBirth.ToLongDateString() });
xmlAuthor.Add(new XElement("DayOfDeath") { Value = author.DayOfDeath.ToLongDateString() });
xmlAuthor.Add(new XElement("Image") { Value = author.Image.AbsolutePath });
return xmlAuthor;
}
}