1

まだ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# 式を使用する方が良いですか?

4

1 に答える 1

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();
于 2013-07-07T23:22:40.767 に答える