使用C#读取和显示XML

时间:2015-08-28 20:56:25

标签: c# xml xmlreader

我无法使用下面的代码显示任何内容。我只是尝试从xml文件中读取数据,并将其与应用程序一起显示。根据我的理解,批处理编译器将是我的根节点。最终我将把数据放在一个csv文件中,但我很慢,以确保并理解所有部分。任何建议都会很棒。

XML

 <?xml version="1.0" encoding="utf-8" ?>
<BatchCompiler>
 <batch>
  <batchid>955698</batchid>
   <transactions>
     <transaction>
       <image>..\images\955698_1_.tif</image>
        <items>
         <item>
          <values>
           <value>
            <name>Bill Base Number</name>
            <data>0002025330</data>
          </value>-<value>
            <name>acct_num2</name>
            <data/>
          </value>-<value>
            <name>Tax Year</name>
            <data>2015</data>
          </value>
        </values>
        </item>
      </items>
      </transaction>
   </transactions>
  </batch>
</BatchCompiler>

CODE:

using System;
using System.Linq;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using System.IO.Compression;
using System.Windows;
using System.Windows.Forms;


namespace GetZip
{
class program
{
    static void Main(string[] args)
    {
XElement xml = XElement.Load("c:\\example\\extract\\index.xml");



        var items = el.Elements("BatchCompiler").Elements("BatchCompiler").DescendantNodes();

        items = from item in el.Elements("values").Elements("values").Descendants()
                where item.Attribute("name").Value == "name"
                select item.FirstNode;

        foreach (XNode node in items)
        {
            Console.WriteLine(node.ToString());

        }
    }
}

}

3 个答案:

答案 0 :(得分:0)

这里有一些问题。

  1. 您的XML无效。如果您实际上将文件加载到内存中(根据您之前的问题,您认为自己是这样),您可能会遇到异常。您有几个未公开的代码:<batch><values><items><item>都缺少样本文档中的结束标记。
  2. 如果您的文档中散布着那些散布文本节点(示例文档中的+-部分),您可能会遇到问题。
  3. 如果您尝试从XElement加载XmlReader,请在完成XmlReader之前关闭XElement。更好的是,将XmlReader包装在using块中,并使用块将XElement的使用放在其中。
  4. 您甚至不需要在此使用XmlReader,只需使用XElement.Load(<filepath>)方法。例如,XElement el = XElement.Load("C:\\example\\extract\\index.xml");。当然,所有这些都预示着你实际上得到了一个有效的XML文档......
  5. 您的.Elements()调用看起来不对,但无法将其修复为文档的当前状态,因为无法按原样解析文档。
  6. 将来,请尝试发布您遇到的具体错误以及您目前尝试解决的步骤 - 例如,您应该在此处获得例外

      

    第10行第6位的'values'开始标记与'transaction'的结束标记不匹配。第20行,第6位。

    看看修复它 - 这实际上意味着首先获得一个有效的XML文档 - 然后如果你仍然遇到麻烦,你将会在一个更好的位置发布一个问题。

答案 1 :(得分:0)

正如丹所说,你的xml无效,应该是:

<BatchCompiler>
  <batch>
   <batchid>955698</batchid>
   <transactions>
    <transaction>
     <image>..\images\955698_1_.tif</image>
     <items>
      <item>
        <values>
          <value>
           <name>Bill Base Number</name>
           <data>0002025330</data>     
          </value>
          <value>
           <name>acct_num2</name>
           <data/>
          </value>
          <value>
           <name>Tax Year</name>
           <data>2015</data>
          </value>
        </values>
      </item>
     </items>
    </transaction>
   </transactions>
  </batch>
</BatchCompiler>

此代码将列出名称元素值:

static void Main(string[] args)
{
    XElement xml = XElement.Load(@"c:\Temp\index.xml");

    var items = xml.Descendants("name");

    foreach (var element in items)
    {
        Console.WriteLine(element.Value);
    }

    Console.WriteLine("Finished");
    Console.ReadLine();
}

答案 2 :(得分:0)

上面/下面的答案用于获取名称值

    static void Main(string[] args)
    {

            XElement xml = XElement.Load("c:\\example\\extract\\index.xml");


           var items = xml.Descendants("name");


        foreach (var element in items) 
         {
            Console.WriteLine(element.Value);

         }

            Console.WriteLine("Finished");
            Console.ReadLine();
   }