Подтвердить что ты не робот

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 правильно?

Если кто-то может показать мне пример или объяснить мне, как это будет сделано, я был бы очень счастлив.

4b9b3361

Ответ 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.

Ответ 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);
 }