2017-06-29 9 views
0

私は別のSetタグから別の値を取得したい複雑なXMLファイルを持っています。最後に、値をCSVファイルに取ります。XPathSelectElementを定義中にエラーが発生しました。C#

私は以下のコードを介して第1の要素を取得しようとしましたが、エラー

とNullReferenceExceptionを取得している

<szItemID>3268750004533</szItemID> from the first set 
<lMerchandiseStructureID>40</lMerchandiseStructureID> from the second set 
<szDesc>PHG VIANDE SECHEE DE</szDesc> from the third set 
<dPackingUnitPriceAmount>75</dPackingUnitPriceAmount> from the fourth tag 

の値を取得しようとしていますxml file format

を参照してください。ハンドルされていません オブジェクト参照がオブジェクトのインスタンスに設定されていません

コード

XmlDocument document = new XmlDocument(); 
     document.Load(@"D:\\xml_1.xml"); 

     string myXmlString = document.OuterXml.ToString(); 

     XElement xml = XElement.Parse(myXmlString); 

     Console.WriteLine(string.Format("{0}",xml.XPathSelectElement("/UpdateDB/Transaction/Insert/Set/szItemID").Value)); 

StringBuilder dataToBeWritten = new StringBuilder(); 


     var doc = XDocument.Load(@"D:\xml_2.xml"); 

     foreach (var trans in doc.Descendants("Transaction")) 

     { 
      var val3 = (string)doc.Descendants("Set").Elements("szItemID").First(); 
      var val4 = (string)doc.Descendants("Set").Elements("lMerchandiseStructureID").First(); 
      var val5 = (string)doc.Descendants("Set").Elements("szName").First(); 
      var val6 = (string)doc.Descendants("Set").Elements("lRetailStoreID").First(); 
      var val7 = (string)doc.Descendants("Set").Elements("bIsContract").First(); 

      dataToBeWritten.Append(val3); 
      dataToBeWritten.Append(","); 
      dataToBeWritten.Append(val4); 
      dataToBeWritten.Append(","); 
      dataToBeWritten.Append(val5); 
      dataToBeWritten.Append(","); 
      dataToBeWritten.Append(val6); 
      dataToBeWritten.Append(","); 
      dataToBeWritten.Append(val7); 
      dataToBeWritten.Append(","); 
      dataToBeWritten.Append(Environment.NewLine); 

     } 


     Console.WriteLine(dataToBeWritten.ToString()); 

     Console.ReadLine(); 


     var testpath = @"D:\\Lutchmee2.csv"; 

     File.WriteAllText(testpath, dataToBeWritten.ToString()); 
+0

の可能な複製を[とNullReferenceExceptionあり、そしてどのように私は何をすべきかそれを修正しますか?](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Fabiano

答えて

0

を助けてくださいあなたのXElementUpdateDBので、そのコンテキストから子UpdateDBはありません。あなたはそれを文字列に変換し、XElementに解析するよりも、DOMに文書をロードしている理由は不明だ、と述べた

/Transaction/Insert/Set/szItemID 

:あなたはにクエリを修正する必要があると思います。ただ、XDocumentにロードして、元のクエリを使用します。

var doc = XDocument.Load(@"D:\xml_1.xml"); 
var val = (string) doc.XPathSelectElement("/UpdateDB/Transaction/Insert/Set/szItemID"); 

またはより良いまだを、それが意図していたとして、XMLにLINQを使用します。

var val = (string) doc.Descendants("Set").Elements("szItemID").First() 
+0

あなたの返信に対する多くの感謝..これは動作しますが、私は持っています別の問題..実際には、私は別のトランザクションタグを持つXMLファイルがある場合どのように各トランザクションタグから各要素を取得するのですか?通常、提供される例は1つの製品の情報で構成されていますが、私は2つの製品を持っています。トランザクションタグのセットが異なります..各トランザクション内のノードの数は同じであることに注意してください。 – Lutch

+0

@LBoodia 'foreach doc.Descendants( "Transaction")){{}}でのvar trans? –

+0

私は上記の新しいコードを試してみましたが、私は別の値を持つ異なるトランザクションタグを持っていますが、私のすべてのレコードは同じです。ありがとうございます – Lutch

関連する問題