Различные способы анализа XML - PullRequest
3 голосов
/ 09 июня 2009

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

Вот мой XML-файл:

<start>
<record>
<var1>hello</var1>
<var2>world</var2>
</record>
<record>
<var1>another</var1>
<var2>one</var2>
</record>
</start>

Вот метод, который я использовал:

string var1 = "", var2 = "";

using(XmlReader r = XmlReader.Create(file))
{
    while(r.Read())
    {
        if (r.MoveToContent() == XmlNodeType.Element)
        {
            if(r.Name == "record")
            {
                var1 = "";
                var2 = "";
            }
            else if(r.Name = "var1")
                var1 = r.ReadElementString();
            else if(r.Name = "var2")
                var2 = r.ReadElementString();
        }
        else if(r.MoveToContent() == XmlNodeType.EndElement && r.Name == "record")
        {
            Console.WriteLine(var1 + " " + var2);
        }
    }

}

Ответы [ 16 ]

6 голосов
/ 09 июня 2009

Вы пробовали Linq To XM L?

Я довольно новичок в этом, так что этот код, вероятно, мог бы быть лучше, но я думаю, что это работает:

XElement xmlData = XElement.Load("XmlFile.xml");
        string var1, var2;
        foreach (XElement element in xmlData.Elements("record"))
        {
            var1 = element.Element("var1").Value;
            var2 = element.Element("var2").Value;

            Console.WriteLine(var1 + " " + var2);

        }
6 голосов
/ 09 июня 2009

Настоящие мужчины не разбираются, они десериализуют .

4 голосов
/ 09 июня 2009

Вот версия, использующая буквальные возможности VB XML.

Dim doc = XDocument.Load(file)
For Each element In doc...<record>
    Dim var1 = element.<var1>.Single()
    Dim var2 = element.<var2>.Single()
    Console.WriteLine(var1.Value & var2.Value)
Next
3 голосов
/ 09 июня 2009

Обычно я просто десериализирую XML в набор объектов, которые затем могу перебирать и обрабатывать. Это потребует создания serealizable объектов, которые будут соответствовать схеме вашей XML-структуры. Если вы не хотите этого делать, Visual Studio поставляется с симпатичной небольшой функцией, называемой XSD, которая позволяет вам генерировать объекты класса из вашего XML-файла. Вы можете запустить XSD из командной строки Visual Studio. Если вам интересно, вот как вы это сделаете:

Запустите следующую команду: XSD path_to_your_xml.xml / o: your_output_directory Это сгенерирует схему для XML.

Получив это, вы генерируете объекты класса, выполняя это: XSD path_to_your_schema.xsd / c / l: cs / o: your_output_directory Это создаст файл .cs с набором классов, необходимых для десериализации вашего XML-файла.

Единственное, что относится к этому методу, это то, что он использует массивы для коллекций. Я обычно меняю их на списки. Просто личное предпочтение. Это должно быть так. Осталось только написать небольшую функцию, которая десериализует ваш xml. Вы можете ввести "xsd /?" просмотреть список других параметров, которые могут вас заинтересовать.

3 голосов
/ 09 июня 2009

О, боже, вам определенно следует рассмотреть XmlDocument, LINQ to XML или XmlSerializer, как предлагали другие. Я использовал XmlReader, и это не для слабонервных. Его преимущество заключается в том, что он является единственным из четырех вариантов, который может читать огромный XML-файл, не считывая все это в память, но если это не проблема, то вы сделаете себе огромную пользу, воспользовавшись одним из интуитивно понятные API.

Если у вас есть право голоса в отношении формата XML, я настоятельно рекомендую подход XmlSerializer, так как он выводит всю XML-сущность из уравнения. Вы имеете некоторый уровень контроля над тем, как объекты будут форматироваться с помощью простых атрибутов ваших свойств и классов. Но в остальном, LINQ to XML является следующим самым простым.

3 голосов
/ 09 июня 2009

Я сделаю второй вызов для XmlSerializer. Напишите XML-схему для своего формата, сгенерируйте классы сериализатора из этого, и вы получите удобный интерфейс и автоматическую валидацию - все бесплатно. Его производительность также довольно хорошая.

3 голосов
/ 09 июня 2009

Я бы предложил выбрать вариант Serialize / DeSerialize. Это было бы более динамичным и менее подверженным ошибкам. Таким образом, вы должны поддерживать свой код много для каждого изменения.

3 голосов
/ 09 июня 2009

Одним из вариантов будет загрузка всего документа в XmlDocument и использование синтаксиса Xpath для извлечения значений - хорошо для небольших (ish) документов, но не подходит для больших документов, так как у вас будут лишние памяти и у вас будет проанализировал весь документ, а не, возможно, только те данные, которые вы хотите. Что-то вроде этого будет работать (с любой проверкой ошибок, удаленной для большей ясности):

XmlDocument doc = new XmlDocument();
doc.Load(filename);

XmlNodeList records = doc.SelectNodes("/start/record");
foreach(XmlNode n : records)
{
   string var1 = n.SelectSingleNode("var1").InnerText;
   string var2 = n.SelectSingleNode("var2").InnerText;
}
2 голосов
/ 10 июня 2009

Как сказал бы Стив Балмер - «Десериализовать !, Десериализовать !, Десериализовать!»

2 голосов
/ 09 июня 2009

Есть несколько способов сделать это. Как анализировать XML-файлы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...