我有一个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,我希望查询到{{1}的<ForgotUsername>
或<ForgotPassword>
子节点文档元素。当我得到<root>
时,我被告知该集合为空。
我做错了什么?
替换实体后的Value的XML:
.Elements()
更新: 在尝试了abatishchev的初步建议后 - 我将问题#1的代码更改为以下内容:
<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>
根据提供的信息,它应该返回值节点中的字符串;但是,它返回null。 xdoc.Elements()(或如上面的代码段所示)返回null。
答案 0 :(得分:2)
XDocument.Parse()
创建支持XML声明的文档要获取单位,请使用
XDocument.Parse("...").Root // or Element("email")
.Elements("meta")
.Elements("smartForm")
.Elements("unit");
或使用XPath:email/meta/smartForm/unit
您也可以使用query-style:
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;
答案 1 :(得分: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。
答案 2 :(得分:0)
对于#1:
XElement doc = XElement.Load(file);
XElement valueElement = doc.Element("value");
string value = (string)valueElement;