我有一个保存在遗留数据库中的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="test@test.com" FromEmail="test@test.com" FromName="password test" Subject="password test" TextBody="info" /><ForgotUsername BccEmail="test@test.com" FromEmail="test@test.com" FromName="test" Subject="test" TextBody="test" /></root></value>
</email>
问题#1 -我试图使用XElement.Parse("string")
解析xml,但是,除非我删除xml声明(即前39个字符),否则我无法获得<value>
节点。我希望不必这样做,因为这是一个脆弱的解决方案。
问题#2 -一旦我有了<value>
元素的内容并将其解析为XElement,我希望查询<root>
文档元素的<ForgotUsername>
或<ForgotPassword>
子节点。当我得到.Elements()
时,我被告知集合是空的。
我做错了什么?
替换实体后的值的XML:
<root>
<ForgotPassword BccEmail="test@test.com" FromEmail="test@test.com" FromName="password test" Subject="password test" TextBody="info" />
<ForgotUsername BccEmail="test@test.com" FromEmail="test@test.com" FromName="test" Subject="test" TextBody="test" />
</root>
更新:在尝试了abatishchev最初的建议之后,我将问题#1的代码更改为以下代码:
var xdoc = XDocument.Parse(contentXml);
return (from element in xdoc.Elements("value")
select element.Value).FirstOrDefault();
根据所提供的信息,返回值节点中的字符串;然而,它返回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
For #1:
XElement doc = XElement.Load(file);
XElement valueElement = doc.Element("value");
string value = (string)valueElement;