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

2

У меня есть строка 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> node, если я не удалю объявление xml (т.е. первые 39 символов). Я надеюсь не делать этого, потому что это хрупкое решение.

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

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

Значение 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>

ОБНОВЛЕНИЕ: Пробовав абатищев первоначальное предложение - я изменил код для вопроса №1 на следующее:

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

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

  • 0
    Вы пробовали XDocument.Parse() вместо XElement.Parse() ?
  • 0
    Пробовал оба и одинаковые результаты с обоими.
Теги:
linq
linq-to-xml

3 ответа

2
Лучший ответ
  • Используйте 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;
    
  • 0
    После переключения на XDocument.Parse () и последующего вызова xdoc.Elements («meta»), он говорит, что Elements () возвращает ноль.
  • 0
    @James: Хорошо, я обновил свой ответ
Показать ещё 4 комментария
1

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

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

Результат - 2, для ForgotPassword и ForgotUsername.

0

Для # 1:

XElement doc = XElement.Load(file);
XElement valueElement = doc.Element("value");
string value = (string)valueElement;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню