Arhn - архитектура программирования

Как использовать LINQ для получения данных из файла XML?

У меня есть файлы xml, которые выглядят так:

<?xml version="1.0" encoding="utf-8"?>
<record id="177" restricted="false">
    <type>record type</type>
    <startdate>2000-10-10</startdate>
    <enddate>2014-02-01</enddate>
    <titles>
        <title xml:lang="en" type="main">Main title</title>
        <!-- only one title element with type main -->
        <title xml:lang="de" type="official">German title</title>
        <!-- can have more titles of type official -->
    </titles>
    <description>description of the record</description>
    <categories>
        <category id="122">
            <name>category name</name>
            <description>category description</description>
        </category>
        <!-- can have more categories -->
    </categories>
    <tags>
        <tag id="5434">
            <name>tag name</name>
            <description>tag description</description>
        </tag>
        <!-- can have more tags -->
    </tags>
</record>

Как выбрать данные из этих XML-файлов с помощью LINQ или использовать что-то еще?

29.03.2014

  • LINQ to XML — хороший выбор. Тебе следует это попробовать. 29.03.2014
  • Учитывая, что вы знаете схему, я бы посоветовал вам сначала десериализовать ее в объекты. Тогда с ним намного проще работать на C#. 29.03.2014
  • Уточните, какие данные вы пытаетесь выбрать. Предпочтительным способом для в наши дни используйте LINQ и XML в C#. 29.03.2014
  • @Cupcake Файл содержит еще некоторые данные, но те, которые указаны здесь, нужны мне (тип записи, дата начала, дата окончания, основной заголовок и все переводы, категории с идентификатором, именем и описанием и то же самое с тегами). У вас есть примеры, я знаю, как создать XDocument и добавить XElements с атрибутами, а затем сохранить его в файл, но как это сделать другим способом (строка xml в XElemet и XDocument). 29.03.2014
  • @Aron, ты имеешь в виду десериализовать его с помощью XMLFormatter и Stream? 29.03.2014
  • Я имею в виду, что вы используете DataContractSerializer или XmlSerializer. 29.03.2014

Ответы:


1

Вы можете загрузить xml в объекты XDocument. с помощью метода Load() для файлов или Parse() метод для строк:

var doc = XDocument.Load("your-file.xml");
// OR
var doc = XDocument.Parse(yourXmlString);

Затем вы можете получить доступ к данным с помощью LINQ:

var titles =
    from title in doc.XPathSelectElements("//title")
    where title.Attribute("type").Value == "official"
    select title.Value;
29.03.2014
  • это дает мне System.NullReferenceException, а title.Attribute("type").Value == "official" выделено... 30.03.2014
  • Это, вероятно, дает вам это, потому что узел title не имеет атрибута type, поэтому он выдает исключение при попытке вызвать .Value для нулевого значения. Вы на самом деле не указали, как вы хотите получить данные, поэтому я просто сделал свой собственный меньший образец XML для работы. Вы можете обойти эту проблему, проверив null перед доступом к дочерним элементам. Подожди, подожди, дай мне перепроверить... 30.03.2014
  • Хорошо, я перепроверил, я использовал именно тот файл XML, который у вас есть в вашем вопросе, и я не получаю никаких NullReferenceExceptions. Если вы используете XML-файл, отличный от того, который указан выше в вашем вопросе, и вы получаете исключения и не можете понять, почему и как это исправить, вам следует задать другой вопрос. 30.03.2014
  • Хорошо, мой плохой. Я изучил весь xml-файл и нашел еще два тега <title>, у которых нет атрибута type, но они мне не нужны. Попробую с doc.XPathSelectElements("/titles/title") 30.03.2014
  • Хорошо, небольшое исправление doc.XPathSelectElements("//titles/title") работает отлично, спасибо XD 30.03.2014
  • Еще одна вещь: как обращаться с атрибутом xml:lang? 30.03.2014
  • См. символ ':', шестнадцатеричное значение 0x3A, не может быть включен в имя и "Символ ':', шестнадцатеричное значение 0x3A, не может быть включен в имя". 30.03.2014
  • Искал примеры Xmlserializer и нашел это: stackoverflow.com/questions/364253/ Так почему бы не попробовать. Я нажал Ctrl+C и Edit -> Paste Special -> Paste XML As Classes в VS 2013 и... Вау, я получил все сгенерированные классы. Одно условие целевой рамки должно быть 4,5 30.03.2014
  • Если это сработало для вас, укажите это как еще один ответ на этот вопрос, и вы даже можете принять его через 48 часов, если хотите. 30.03.2014
  • Хороший вопрос, другие тоже должны знать. В любом случае спасибо за вашу помощь. 30.03.2014

  • 2

    Искал примеры Xmlserializer и нашел это: Как десериализовать XML-документ Так почему бы и не попробовать. Я сделал Ctrl+C и Правка -> Специальная вставка -> Вставить XML как классы в Visual Studio 2013 и... Вау, я получил все сгенерированные классы. Одна целевая структура условия должна быть 4.5, и эта функция доступна в Visual Studio 2012+ (как указано в этом сообщении).

    30.03.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..