定义XPathSelectElement时出错c#

时间:2017-06-29 08:31:02

标签: c# xml csv xpath xml-parsing

我有一个复杂的XML文件,我想从不同的Set标签​​中检索不同的值。最后,我需要将这些值转换为CSV文件。

请参阅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));

我试图通过以下代码检索第一个元素,但收到错误

  

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

代码

  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());

请帮忙

{{1}}

1 个答案:

答案 0 :(得分:0)

您的XElement UpdateDB,因此从该上下文中没有子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 to XML:

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