如何使用xpath读取XML文件的标头信息

时间:2019-06-20 11:37:06

标签: c# xpath

所需的输出

enter image description here

我正在尝试使用xpath读取xml文档。我能够阅读某些内容,但有些则看不到。我正在尝试读取此xml文件并将此信息写入excel文件

我尝试了以下

    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();

 xmlDoc.Load("C:/Users/mypc/Documents/project/myfile.xml");
            XmlNode titleNode = xmlDoc.SelectSingleNode("//header");
            using (StreamWriter outputFile = new StreamWriter("C:/Users/myuser/Documents/project/WriteLines.txt"))
            {
                if (titleNode != null)
                    Console.WriteLine(titleNode.InnerText.ToString());
                outputFile.WriteLine(titleNode.InnerText);
            }
            Console.ReadKey();
        }
    }

我的xml文件如下所示

<header version="2.0">
    <phone>1234567</phone>
    <houseNumber>45</houseNumber>
    <date>2015-09-19</date>
    <deliveryId>12345696015</deliveryId>
  </header>

有什么方法可以读取孩子并将其写入excel文件吗?

2 个答案:

答案 0 :(得分:0)

希望此代码对您有帮助。 {

        DataTable dt = new System.Data.DataTable();  
        dt.TableName = "Details";  
       dt.Columns.Add("phone", typeof(string));  
        dt.Columns.Add("houseNumber", typeof(string));  
         dt.Columns.Add("date", typeof(string));  
        dt.Columns.Add("deliveryId", typeof(string)); 

        dt.Rows.Add("1234567", "45","2015-09-19","KV12_3896096015");  


       //Create Temp directory to save xml file  
        var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());  
         Directory.CreateDirectory(tempDir);  
        string path = Path.Combine(tempDir, string.Format("{0}.{1}", "Prodcuts", "xml"));  
       //Write to xml file  
        dt.WriteXml(path, System.Data.XmlWriteMode.IgnoreSchema);  

        //Create HttpClient and MultipartFormDataContent  
        using (var client = new HttpClient())  
        using (var formData = new MultipartFormDataContent())  
        using (var fromFile=File.OpenRead(path))  
        {  

            formData.Add(new StringContent("Test"), "FileName");  
            formData.Add(new StringContent("xlsx"), "FileFormat");  
            formData.Add(new StreamContent(fromFile), "DataFile",Path.GetFileName(path));  
            //Call WebAPI  
            var response = client.PostAsync(webapiURL, formData).Result;  
            if (!response.IsSuccessStatusCode)  
            {  
                MessageBox.Show("Invalid response.");  
                return;  
            }  
            var tempPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());  
            if (!Directory.Exists(tempPath))  
            {  
                Directory.CreateDirectory(tempPath);  
            }  
            //Save Excel file to Temp directory  

}

答案 1 :(得分:0)

第1部分-遍历子节点

使用XPath在文档中找到<header>元素已经做得很好。要从单个子节点提取信息,只需使用ChildNodes的值LocalNameInnerText的{​​{1}}属性对XmlNode集合进行迭代,即可得到如下输出:

foreach (XmlNode xmlNode in xmlDoc.SelectSingleNode("//header").ChildNodes)
{
    Console.WriteLine(xmlNode.LocalName + ", " + xmlNode.InnerText);
}

请注意,//header XPath与SelectSingleNode组合会选择文档中任何位置的第一个<header>元素。如果要选择文档的根节点,则应使用/header,但是选择单个根节点可能不值得XPath查询。

第2部分-输出到MS Excel

我建议您选择一些third party package以产生特定格式的输出。如果您只需要简单的导出以进行进一步处理,则最简单的方法是生成CSV文件,您可以在MS Excel中轻松打开该文件:

using System.Linq;
// ...
var separator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator;
var output = xmlDoc.SelectSingleNode("//header").ChildNodes.Cast<XmlNode>()
    .Select(xmlNode => xmlNode.LocalName + separator + xmlNode.InnerText);
System.IO.File.WriteAllLines("output.csv", output);

请注意,这是一个非常简单的解决方案。适当的解决方案将在输出中包含一些escaping of values