2017-06-29 60 views
0

我有一个复杂的XML文件,我想从不同的Set标记中检索不同的值。最后,我需要将这些值传递给一个CSV文件。定义XPathSelectElement时发生错误c#

请参阅xml file format

我试图检索

<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 

我试图通过下面的代码检索第一个元素的值,但得到一个错误

的NullReferenceException未处理 未将对象引用设置为对象的实例

代码

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。你必须到您的查询修改为:

/Transaction/Insert/Set/szItemID 

这就是说,目前还不清楚为什么你加载文档到DOM,将其转换为字符串,比解析到XElement。只需加载到一个XDocument和使用您的原始查询:

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

或者更好的是,使用LINQ到XML作为它的目的是:

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

非常感谢您的答复..这个作品,但我有另一个问题..实际上,如果我有一个XML文件与不同的交易标签如何从每个交易标签检索每个元素?通常情况下,提供的例子包括一个产品的信息,我可能有文件,我有两个产品..这是我有不同的交易标记集。注意每个交易中的节点数保持不变 – Lutch

+0

@Loody'foreach doc.Descendants中的var trans(“Transaction”)){..}'? –

+0

我已经尝试了上面的新代码,但所有我的记录都是一样的,即使我有不同的值不同的交易标记..任何想法?非常感谢 – Lutch