如何访问子xml元素?

时间:2011-04-25 21:22:23

标签: c# xml linq linq-to-xml

我有一个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="test@test.com" FromEmail="test@test.com" FromName="password test" Subject="password test" TextBody="info" /&gt;&lt;ForgotUsername BccEmail="test@test.com" FromEmail="test@test.com" FromName="test" Subject="test" TextBody="test" /&gt;&lt;/root&gt;</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。

3 个答案:

答案 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;