XML-анализ - чтение простого XML файла и получение значений
Я написал программу планирования заданий для обучения. В настоящее время я сохраняю запланированные задачи так же, как обычный текст, а затем анализирую его с помощью Regex. Это выглядит грязным (код мудрый) и не очень согласован.
Я хотел бы загружать запланированные задачи из файла XML вместо этого, я искал довольно много, чтобы найти некоторые решения, но я не мог заставить его работать так, как я хотел.
Я написал XML файл, структурированный таким образом, чтобы хранить мои данные в:
<Tasks>
<Task>
<Name>Shutdown</Name>
<Location>C:/WINDOWS/system32/shutdown.exe</Location>
<Arguments>-s -f -t 30</Arguments>
<RunWhen>
<Time>8:00:00 a.m.</Time>
<Date>18/03/2011</Date>
<Days>
<Monday>false</Monday>
<Tuesday>false</Tuesday>
<Wednesday>false</Wednesday>
<Thursday>false</Thursday>
<Friday>false</Friday>
<Saturday>false</Saturday>
<Sunday>false</Sunday>
<Everyday>true</Everyday>
<RunOnce>false</RunOnce>
</Days>
</RunWhen>
<Enabled>true</Enabled>
</Task>
</Tasks>
То, как я хотел бы проанализировать данные, выглядит так:
- Открыть Tasks.xml
- Загрузите первый тег Task.
- В этой задаче получить значения тегов Name, Location и Arguments.
- Затем откройте тег RunWhen и извлеките значения тегов Time и Date.
- После этого откройте тег Days и найдите значение каждого отдельного тега внутри.
- Получить значение Enabled.
- Загрузите следующую задачу и повторите шаги 3 → 7 до тех пор, пока все теги Задачи в Задачах не будут проанализированы.
Я очень уверен, что вы можете сделать это таким образом, я просто не могу разобраться, так как существует много разных способов сделать что-то в XML. Я немного перегружен. Но что я до сих пор делал, что я, скорее всего, буду использовать XPathDocument и XPathNodeIterator правильно?
Если кто-то может показать мне пример или объяснить мне, как это будет сделано, я был бы очень счастлив.
Ответы
Ответ 1
Простым способом анализа XML файла является использование LINQ to XML
например, у вас есть следующий xml файл
<library>
<track id="1" genre="Rap" time="3:24">
<name>Who We Be RMX (feat. 2Pac)</name>
<artist>DMX</artist>
<album>The Dogz Mixtape: Who Next?!</album>
</track>
<track id="2" genre="Rap" time="5:06">
<name>Angel (ft. Regina Bell)</name>
<artist>DMX</artist>
<album>...And Then There Was X</album>
</track>
<track id="3" genre="Break Beat" time="6:16">
<name>Dreaming Your Dreams</name>
<artist>Hybrid</artist>
<album>Wide Angle</album>
</track>
<track id="4" genre="Break Beat" time="9:38">
<name>Finished Symphony</name>
<artist>Hybrid</artist>
<album>Wide Angle</album>
</track>
<library>
Для чтения этого файла вы можете использовать следующий код:
public void Read(string fileName)
{
XDocument doc = XDocument.Load(fileName);
foreach (XElement el in doc.Root.Elements())
{
Console.WriteLine("{0} {1}", el.Name, el.Attribute("id").Value);
Console.WriteLine(" Attributes:");
foreach (XAttribute attr in el.Attributes())
Console.WriteLine(" {0}", attr);
Console.WriteLine(" Elements:");
foreach (XElement element in el.Elements())
Console.WriteLine(" {0}: {1}", element.Name, element.Value);
}
}
Ответ 2
Я обычно использую XmlDocument
. Интерфейс довольно прост:
var doc = new XmlDocument();
doc.LoadXml(xmlString);
Вы можете получить доступ к узлам, похожим на словарь:
var tasks = doc["Tasks"];
и петлю над всеми дочерними элементами node.
Ответ 3
Вы знакомы с классом DataSet
?
DataSet
может также load
XML-документов, и вам может быть проще итерации.
http://msdn.microsoft.com/en-us/library/system.data.dataset.readxml.aspx
DataSet dt = new DataSet();
dt.ReadXml(@"c:\test.xml");
Ответ 4
Попробуйте XmlSerialization
попробуйте это
[Serializable]
public class Task
{
public string Name{get; set;}
public string Location {get; set;}
public string Arguments {get; set;}
public DateTime RunWhen {get; set;}
}
public void WriteXMl(Task task)
{
XmlSerializer serializer;
serializer = new XmlSerializer(typeof(Task));
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream, Encoding.Unicode);
serializer.Serialize(writer, task);
int count = (int)stream.Length;
byte[] arr = new byte[count];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(arr, 0, count);
using (BinaryWriter binWriter=new BinaryWriter(File.Open(@"C:\Temp\Task.xml", FileMode.Create)))
{
binWriter.Write(arr);
}
}
public Task GetTask()
{
StreamReader stream = new StreamReader(@"C:\Temp\Task.xml", Encoding.Unicode);
return (Task)serializer.Deserialize(stream);
}