如何访问子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,我希望查询<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;

相关内容

  • 没有找到相关文章

最新更新