У меня есть строка 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><?xml version="1.0" encoding="utf-16"?><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></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.
XDocument.Root
перед 26.04.2011