Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 25 additions & 3 deletions xml-csharp/ReadXML/ReadXML/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,33 @@
Console.ReadKey();

Console.Clear();
Console.WriteLine("XmlReader: Read names and ages from XML document with people data:\n");
Console.WriteLine("XmlReader: Read names and surnames from XML document with people data:\n");
Console.WriteLine("\n---\n");
ReadXmlUsingXmlReader.ReadNamesAndAges(
ReadXmlUsingXmlReader.ReadNamesAndSurnames(
CreateXmlUsingXmlWriter.CreateAnArrayOfPeople(people)
)
.ToList()
.ForEach(Console.WriteLine);
Console.ReadKey();
Console.ReadKey();

Console.Clear();
Console.WriteLine("Read an XML file from the output folder:\n");
Console.WriteLine("\n---\n");
ReadXmlFromFile.ReadEmailsUsingXDocument(ReadXmlFromFile.FilePath)
.ToList()
.ForEach(Console.WriteLine);
ReadXmlFromFile.ReadEmailsUsingXmlReader(ReadXmlFromFile.FilePath)
.ToList()
.ForEach(Console.WriteLine);
ReadXmlUsingXmlDocument.ReadEmails(ReadXmlFromFile.FilePath)
.ToList()
.ForEach(Console.WriteLine);
Console.ReadKey();

Console.Clear();
Console.WriteLine("XmlReader: Read names and surnames from people.xml:\n");
Console.WriteLine("\n---\n");
var xml = File.ReadAllText(ReadXmlFromFile.FilePath);

foreach (var row in ReadXmlUsingXmlReader.ReadNamesAndSurnames(xml))
Console.WriteLine(row);
35 changes: 35 additions & 0 deletions xml-csharp/ReadXML/ReadXML/Read/ReadXmlFromFile.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System.Xml;
using System.Xml.Linq;

namespace ReadXml.Read
{
public static class ReadXmlFromFile
{
public static readonly string FilePath =
Path.Combine(AppContext.BaseDirectory, "people.xml");

public static IEnumerable<string> ReadEmailsUsingXDocument(string path)
{
var xmlDoc = XDocument.Load(path);

return xmlDoc.Root!
.Elements("person")
.Select(person => person.Element("email")!.Value)
.ToList();
}

public static IEnumerable<string> ReadEmailsUsingXmlReader(string path)
{
using var reader = XmlReader.Create(path);

List<string> result = [];
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "email")
result.Add(reader.ReadElementContentAsString());
}

return result;
}
}
}
18 changes: 18 additions & 0 deletions xml-csharp/ReadXML/ReadXML/Read/ReadXmlUsingXmlDocument.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using System.Xml;

namespace ReadXml.Read
{
public static class ReadXmlUsingXmlDocument
{
public static IEnumerable<string> ReadEmails(string path)
{
var xmlDoc = new XmlDocument();
xmlDoc.Load(path);

return xmlDoc.GetElementsByTagName("email")
.Cast<XmlNode>()
.Select(node => node.InnerText)
.ToList();
}
}
}
45 changes: 22 additions & 23 deletions xml-csharp/ReadXML/ReadXML/Read/ReadXmlUsingXmlReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,39 +33,38 @@ public static IEnumerable<string> ReadXmlWithoutWhiteSpace(string xml)
return result;
}

public static IEnumerable<string> ReadNamesAndAges(string xml)
public static IEnumerable<string> ReadNamesAndSurnames(string xml)
{
var settings = new XmlReaderSettings
{
IgnoreWhitespace = true
};

List<string> result = [];
using var reader = XmlReader.Create(new StringReader(xml), settings);

List<string> result = [];
var personData = new PersonData();
var numberOfPersons = 0;

while (reader.Read())
{
var personData = new PersonData();
var numberOfPersons = 0;
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "person")
personData.Init();

if (reader.Name == "firstName")
personData.FirstName = reader.ReadElementContentAsString();

if (reader.Name == "lastName")
personData.LastName = reader.ReadElementContentAsString();
}

while (reader.Read())
if (reader.NodeType == XmlNodeType.EndElement)
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "person")
personData.Init();

if (reader.Name == "firstName")
personData.FirstName = reader.ReadElementContentAsString();

if (reader.Name == "lastName")
personData.LastName = reader.ReadElementContentAsString();
}

if (reader.NodeType == XmlNodeType.EndElement)
{
if (reader.Name == "person")
result.Add($"#{++numberOfPersons,3} | " +
$"{personData.FirstName,-15} | {personData.LastName,-15}");
}
if (reader.Name == "person")
result.Add($"#{++numberOfPersons,3} | " +
$"{personData.FirstName,-15} | {personData.LastName,-15}");
}
}

Expand Down
6 changes: 5 additions & 1 deletion xml-csharp/ReadXML/ReadXML/ReadXML.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<None Update="people.xml" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

</Project>
35 changes: 35 additions & 0 deletions xml-csharp/ReadXML/ReadXML/people.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<people>
<person>
<name>
<firstName>Olivia</firstName>
<lastName>Davis</lastName>
</name>
<email>olivia.davis@code-maze.com</email>
<age>34</age>
</person>
<person>
<name>
<firstName>John</firstName>
<lastName>Davis</lastName>
</name>
<email>john.davis@code-maze.com</email>
<age>41</age>
</person>
<person>
<name>
<firstName>Sarah</firstName>
<lastName>Moore</lastName>
</name>
<email>sarah.moore@code-maze.com</email>
<age>27</age>
</person>
<person>
<name>
<firstName>Sarah</firstName>
<lastName>Smith</lastName>
</name>
<email>sarah.smith@code-maze.com</email>
<age>62</age>
</person>
</people>
46 changes: 46 additions & 0 deletions xml-csharp/ReadXML/Tests/Read/ReadXmlFromFileTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
namespace Tests.Read
{
[TestClass]
public class ReadXmlFromFileTests
{
private static readonly string[] ExpectedEmails =
[
"olivia.davis@code-maze.com",
"john.davis@code-maze.com",
"sarah.moore@code-maze.com",
"sarah.smith@code-maze.com"
];

[TestMethod]
public void GivenPeopleFile_WhenCallingReadEmailsUsingXDocument_ThenAllEmailsAreReturned()
{
var result = ReadXmlFromFile.ReadEmailsUsingXDocument(ReadXmlFromFile.FilePath);

CollectionAssert.AreEqual(ExpectedEmails, result.ToArray());
}

[TestMethod]
public void GivenPeopleFile_WhenCallingReadEmailsUsingXmlReader_ThenAllEmailsAreReturned()
{
var result = ReadXmlFromFile.ReadEmailsUsingXmlReader(ReadXmlFromFile.FilePath);

CollectionAssert.AreEqual(ExpectedEmails, result.ToArray());
}

[TestMethod]
public void GivenPeopleFile_WhenCallingXmlDocumentReadEmails_ThenAllEmailsAreReturned()
{
var result = ReadXmlUsingXmlDocument.ReadEmails(ReadXmlFromFile.FilePath);

CollectionAssert.AreEqual(ExpectedEmails, result.ToArray());
}

[TestMethod]
public void GivenMissingFile_WhenCallingXDocumentLoad_ThenFileNotFoundExceptionIsThrown()
{
var missing = Path.Combine(AppContext.BaseDirectory, "missing.xml");

Assert.ThrowsExactly<FileNotFoundException>(() => ReadXmlFromFile.ReadEmailsUsingXDocument(missing));
}
}
}
4 changes: 2 additions & 2 deletions xml-csharp/ReadXML/Tests/Read/ReadXmlUsingXmlReaderTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public void GivenValidXmlString_WhenCallingReadXml_ThenWhitespacesAreIsReturned(
[TestMethod]
public void GivenInvalidXmlString_WhenCallingReadXml_ThenExceptionIsThrown()
{
Assert.ThrowsException<XmlException>(() => ReadXmlUsingXmlReader.ReadXml(CreateInvalidXmlString()));
Assert.ThrowsExactly<XmlException>(() => ReadXmlUsingXmlReader.ReadXml(CreateInvalidXmlString()));
}


Expand All @@ -41,7 +41,7 @@ public void GivenNumberOfPersons_WhenCallingCreateAnArrayOfPeople_ThenSameNumber
var people = People.Get(numberOfPersons);
var arrayOfPeople = CreateXmlUsingXmlWriter.CreateAnArrayOfPeople(people);

var result = ReadXmlUsingXmlReader.ReadNamesAndAges(arrayOfPeople);
var result = ReadXmlUsingXmlReader.ReadNamesAndSurnames(arrayOfPeople);

Assert.AreEqual(numberOfPersons, result.Count());
}
Expand Down
10 changes: 5 additions & 5 deletions xml-csharp/ReadXML/Tests/Tests.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>

Expand All @@ -10,10 +10,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
<PackageReference Include="MSTest.TestAdapter" Version="3.0.4" />
<PackageReference Include="MSTest.TestFramework" Version="3.0.4" />
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.11.0" />
<PackageReference Include="MSTest.TestAdapter" Version="4.5.2" />
<PackageReference Include="MSTest.TestFramework" Version="4.5.2" />
<PackageReference Include="coverlet.collector" Version="10.1.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Loading