У меня есть строка 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>
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.
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;
Для меня работает следующее:
var xd = XDocument.Load("Test.xml");
var xv = XDocument.Parse((string)xd.Root.Element("value"));
Console.WriteLine(xv.Root.Elements().Count());
Результат - 2, для ForgotPassword и ForgotUsername.
Для # 1:
XElement doc = XElement.Load(file);
XElement valueElement = doc.Element("value");
string value = (string)valueElement;
XDocument.Parse()
вместоXElement.Parse()
?