Хобрук: Ваш путь к мастерству в программировании

Как получить доступ к дочерним элементам xml?

У меня есть строка xml, сохраненная в устаревшей базе данных, которую я пытаюсь проанализировать. Я могу получить строку, но у меня есть 2 проблемы с получением значений, которые мне нужны. Во-первых, некоторый образец xml.

<?xml version="1.0" encoding="utf-16"?>
<email>
    <meta>
        <smartForm>
            <unit name="ForgotUsername" label="Forgot Username Email">
                <textBox name="FromEmail" label="From Email" type="Email" />
                <textBox name="FromName" label="From Name" type="100" />
                <textBox name="BccEmail" label="BCC" type="EmailList" />
                <textBox name="Subject" label="Subject" type="300" />
                <textBox2 name="TextBody" label="Body" type="Memo" />
            </unit>
            <unit name="ForgotPassword" label="Forgot Password Email">
                <textBox name="FromEmail" label="From Email" type="Email" />
                <textBox name="FromName" label="From Name" type="100" />
                <textBox name="BccEmail" label="BCC" type="EmailList" />
                <textBox name="Subject" label="Subject" type="300" />
                <textBox2 name="TextBody" label="Body" type="Memo" />
            </unit>
        </smartForm>
    </meta>
    <value>&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;root&gt;&lt;ForgotPassword BccEmail="[email protected]" FromEmail="[email protected]" FromName="password test" Subject="password test" TextBody="info" /&gt;&lt;ForgotUsername BccEmail="[email protected]" FromEmail="[email protected]" FromName="test" Subject="test" TextBody="test" /&gt;&lt;/root&gt;</value>
</email>

Проблема № 1. Я попытался проанализировать xml, используя XElement.Parse("string"), однако я не могу получить узел <value>, если не удалю объявление xml (т.е. первые 39 символов). Я надеюсь, что мне НЕ НУЖНО этого делать, так как это хрупкое решение.

Проблема № 2. После того, как я получил содержимое элемента <value> и проанализировал его в XElement, мне нужен запрос к дочернему узлу <ForgotUsername> или <ForgotPassword> элемента документа <root>. Когда я получил .Elements(), мне сказали, что коллекция пуста.

Что я делаю неправильно?

XML значения после замены сущностей:

<root>
    <ForgotPassword BccEmail="[email protected]" FromEmail="[email protected]" FromName="password test" Subject="password test" TextBody="info" />
    <ForgotUsername BccEmail="[email protected]" FromEmail="[email protected]" FromName="test" Subject="test" TextBody="test" />
</root>

UPDATES: After trying abatishchev's initial suggestion - I changed the code for issue #1 to the following:

var xdoc = XDocument.Parse(contentXml);
return (from element in xdoc.Elements("value")
        select element.Value).FirstOrDefault();

На основе предоставленной информации он должен вернуть строку в узле значения; однако он возвращает ноль. xdoc.Elements() (или как показано в приведенном выше фрагменте) возвращает значение null.

25.04.2011

  • Вы пробовали XDocument.Parse() вместо XElement.Parse()? 26.04.2011
  • Пробовал оба и тот же результат с обоими. 26.04.2011

Ответы:


1
  • Используйте XDocument.Parse() для создания документа, поддерживающего XML-декларацию.
  • Чтобы получить единицы, используйте

    XDocument.Parse("...").Root // or Element("email")
        .Elements("meta")
            .Elements("smartForm")
                .Elements("unit");
    
  • или используйте XPath: email/meta/smartForm/unit

  • также вы можете использовать стиль запроса:

    var doc = XDocument.Parse("...");
    var q = from meta in doc.Root.Elements("meta")
            from smartForm in meta.Elements("smartForm")
            from unit in smartForm.Elements("unit")
            select unit;
    
25.04.2011
  • После переключения на XDocument.Parse() и последующего вызова xdoc.Elements(meta) он говорит, что Elements() возвращает null. 26.04.2011
  • Добавлен фрагмент к основному вопросу. 26.04.2011
  • @James: Короче говоря, добавьте XDocument.Root перед 26.04.2011
  • Вот оно. Забыл рут. Я знал, что это что-то простое. Спасибо! 26.04.2011

  • 2

    Для меня работает следующее:

    var xd = XDocument.Load("Test.xml");
    var xv = XDocument.Parse((string)xd.Root.Element("value"));
    Console.WriteLine(xv.Root.Elements().Count());
    

    Вывод равен 2 для ForgotPassword и ForgotUsername.

    25.04.2011

    3

    Для №1:

    XElement doc = XElement.Load(file);
    XElement valueElement = doc.Element("value");
    string value = (string)valueElement;
    
    25.04.2011
    Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..