以前にこの質問をしたところ、非常に迅速で役立つ回答が得られました。Linq to XML クエリが値を取得しない
正しいとマークされた回答に示されているアドバイスに従い、「製品」タグを取得することができました。データベースにインポートする値を見つけるために、その「製品」タグ内を検索していますが、また少し行き詰まっています。
私のXMLファイルの構造は次のとおりです。
<?xml version="1.0"?>
<!DOCTYPE ONIXMessage SYSTEM "http://www.editeur.org/onix/2.1/reference/onix-international.dtd">
<ONIXMessage xmlns="http://www.editeur.org/onix/2.1/reference" release="2.1">
<Header>
<FromCompany>MyCo</FromCompany>
<FromPerson>Joe Bloggs</FromPerson>
<FromEmail>joe@bloggs.com</FromEmail>
<SentDate>20120522</SentDate>
</Header>
<Product>
<ProductForm>DG</ProductForm>
<Title>
<TitleType>01</TitleType>
<TitleText>Blogg</TitleText>
</Title>
<WorkIdentifier>
<WorkIDType>15</WorkIDType>
<IDValue>PI3564231</IDValue>
</WorkIdentifier>
<Language>
<LanguageRole>01</LanguageRole>
<LanguageCode>eng</LanguageCode>
</Language>
</Product>
</ONIXMessage>
これが私のコードのスニペットです:
XElement onix = XElement.Load(fs);
// Get all the product information.
//
var products = onix.Descendants().Where(m => m.Name.LocalName == "Product").ToList();
foreach (var p in products)
{
try
{
prod.Title = p.Elements("Title").First(t => (t.Element("TitleType").Value == "01")).Element("TitleText").Value;
//further processing
}
catch (Exception exp)
{
throw new FileProcessingException("Unable to process product.", exp);
}
}
上記のようにタイトル テキストを検索すると、例外がキャッチされます。例外は、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」です。アイテムは明らかに XML ファイルにありますが、正しく取得されていません。
toda の前に .Descendants() を見たことがなく、その意味がわかりますが、読んだことから、ここでも .Elements() を使用できるはずですか?
何が間違っているのか誰にもわかりますか?