2017-03-16 5 views
2

XMLを解析して顧客のコレクションを返す汎用ユーティリティを作成しようとしています。異なるファイルのLINQ to XML

問題は、1つのファイルに1つの要素がないことです。

この種の状況がLINQを使用して処理できるかどうかは知りたいと思います。

通常のXPATHまたはXMLDocumentを使用している間は、これを無視したり、コードにデフォルト値を割り当てることができます。

ここに私のコードです。

マイXMLファイル

お客様1

<customers> 
    <customer> 
    <first_name>F1</first_name> 
    <last_name>L1</last_name> 
    </customer> 
    <customer> 
    <first_name>F2</first_name> 
    <last_name>L2</last_name> 
    </customer> 
</customers> 

カスタマー2

<?xml version="1.0" encoding="utf-8" ?> 
<customers> 
    <customer> 
    <first_name>F1</first_name> 
    <middle_name>M1</middle_name> 
    <last_name>L1</last_name> 
    </customer> 
    <customer> 
    <first_name>F2</first_name> 
    <middle_name>M2</middle_name> 
    <last_name>L2</last_name> 
    </customer> 
</customers> 

私のクラス

public class Customer 
     { 
     public string FirstName { get; set; } 
     public string MiddleName { get; set; } 
     public string LastName { get; set; } 
     } 

これらのXMLファイルを解析するための私のコード

XDocument doc = XDocument.Load(@"D:\\Projects\\Customer1.xml"); 

     var cCusts = from c in doc.Descendants("customer") 
        select new Customer 
        { 
         FirstName = c.Element("first_name").Value, 
         MiddleName = c.Element("middle_name").Value, 
         LastName = c.Element("last_name").Value, 
        }; 

私のコードを実行すると、 "オブジェクト参照が設定されていません"というエラーが発生します。要素を見つけることができません。

しかし、同じクエリを使用すると、要素が存在しないかどうかを実際に確認することはできますか?または、顧客1と2に対して別のコードを記述する必要がありますか?

答えて

2

Valueプロパティから値を取得する代わりに、cast XElementを文字列に変換することができます。

var cCusts = from c in doc.Descendants("customer") 
        select new Customer 
        { 
         FirstName = (string)c.Element("first_name"), 
         MiddleName = (string)c.Element("middle_name"), 
         LastName = (string)c.Element("last_name") 
        }; 
+0

これは完璧に動作します...ありがとう – A3006

+0

ただ一つ..私はc.Element( "middle_name")+ "(文字列)の代わりに、コードがキャストに失敗した場合にエラーをスローしないことを確認するだけです?? – A3006

+0

はいいつでも試すことができます:https://dotnetfiddle.net/9OLnvc – har07

3

あなたは?.オペレータがc.Element("last_name")がnullであるかどうかを確認し、その(あなたが例外を取得することはありません意味する)場合はnullを返します

LastName = c.Element("last_name")?.Value; 

または

LastName = c.Element("last_name")?.Value ?? "N/A"; 

ような何かを行うことができます。いくつかのデフォルト値を追加する場合は、が前の式がnullであるかどうかを確認し、LastNameにデフォルトの "該当なし"値を与える2番目のオプションを使用できます。

また、,の末尾にLastName = c.Element("last_name").Value,があります。

+0

を、これは、単一のステートメントである場合にのみ動作します:middle_nameが存在しない場合、この方法は、あなたの代わりにヌル参照例外のnullを得るでしょう。上に貼り付けたLINQクエリ。これを変更すると、コードはコンパイルされません。 – A3006

+0

それは私のためにうまく準拠しています。あなたはどんなエラーを出していますか? –

+0

エラー式の用語 '。'が無効です。 \t エラー構文エラー ':'予期している – A3006