Linq对XML元素和后代进行了相同的搜索

时间:2013-07-07 22:54:45

标签: linq linq-to-xml

还在学习Linq并且在同一个选择中尝试检索和元素以及另一个的后代时遇到了问题。我搜索了一个解决方案,但找不到我要找的东西,想出了解决方案。但这是正确的方法吗?不知何故,虽然它有效但感觉确实合适。

我有以下XML结构:

<Tables>
    <Table>
        <SourceTable>WrittenRecordsTable</SourceTable>
        <Researcher>Fred Blogs</Researcher>
        <QuickRef>cwr</QuickRef>
        <TableType>WrittenRecords</TableType>
        <FieldMapping>
            <RecordID>ID</RecordID>
            <StartYear>StartYear</StartYear>
            <EndYear>EndYear</EndYear>
            <LastName>LastName</LastName>
            <Title>Title</Title>
            <Subject>Subject</Subject>
            <Description>Reference</Description>
        </FieldMapping>
    </Table>
</Tables>

以及以下Linq to XML:

var nodes = (from n in xml.Descendants("FieldMapping")
            select new
            {
                SourceTable = (string)n.Parent.Element("SourceTable").Value,
                RecordID = (string)n.Element("RecordID").Value,
                StartYear = (string)n.Element("StartYear").Value,
                EndYear = (string)n.Element("EndYear").Value,
                LastName = (string)n.Element("LastName").Value,
                Title = (string)n.Element("Title").Value,
                Subject = (string)n.Element("Subject").Value
             }).ToList();

这是我检索感觉错误的 SourceTable 元素的方式。我担心太多还是有更好的方法?另外,使用c#表达式而不是查询更好吗?

1 个答案:

答案 0 :(得分:1)

如果您的文档结构始终必须包含这些节点,那么您的查询(以及访问SourceTable)就可以了。在读者知道XML是什么样的情况下,这是显而易见的。

但是,如果您想要更多自上而下的方法(可能似乎更自然且更容易掌握),您始终可以先查询Table节点并存储FieldMapping在变量中,但我不会说它比你的方法有任何优势:

var nodes = (from table in doc.Descendants("Table")
             let fieldMapping = table.Element("FieldMapping")
             select new
             {
                 SourceTable = (string)table.Element("SourceTable").Value,
                 RecordID = (string)fieldMapping.Element("RecordID").Value,
                 StartYear = (string)fieldMapping.Element("StartYear").Value,
                 EndYear = (string)fieldMapping.Element("EndYear").Value,
                 LastName = (string)fieldMapping.Element("LastName").Value,
                 Title = (string)fieldMapping.Element("Title").Value,
                 Subject = (string)fieldMapping.Element("Subject").Value
             }).ToList();