如何在C#中读取和解析XML文件?

时间:2009-03-13 11:41:36

标签: c# xml

如何在C#中读取和解析XML文件?

11 个答案:

答案 0 :(得分:416)

XmlDocument从字符串或文件中读取XML。

XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");

doc.LoadXml("<xml>something</xml>");

然后在它下面找到一个节点,就像这样

XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");

foreach(XmlNode node in doc.DocumentElement.ChildNodes){
   string text = node.InnerText; //or loop through its children as well
}

然后像这样读取该节点内的文本

string text = node.InnerText;

或读取属性

string attr = node.Attributes["theattributename"]?.InnerText

始终在Attributes [“something”]上检查null,因为如果该属性不存在,它将为null。

答案 1 :(得分:190)

LINQ to XML 示例:

// Loading from a file, you can also load from a stream
var xml = XDocument.Load(@"C:\contacts.xml");


// Query the data and write out a subset of contacts
var query = from c in xml.Root.Descendants("contact")
            where (int)c.Attribute("id") < 4
            select c.Element("firstName").Value + " " +
                   c.Element("lastName").Value;


foreach (string name in query)
{
    Console.WriteLine("Contact's Full Name: {0}", name);
}
在MSDN上

参考LINQ to XML

答案 2 :(得分:15)

这是我为阅读xml站点地图而编写的应用程序:

using System;
using System.Collections.Generic;
using System.Windows.Forms; 
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using System.Xml;

namespace SiteMapReader
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please Enter the Location of the file");

            // get the location we want to get the sitemaps from 
            string dirLoc = Console.ReadLine();

            // get all the sitemaps 
            string[] sitemaps = Directory.GetFiles(dirLoc);
            StreamWriter sw = new StreamWriter(Application.StartupPath + @"\locs.txt", true);

            // loop through each file 
            foreach (string sitemap in sitemaps)
            {
                try
                {
                    // new xdoc instance 
                    XmlDocument xDoc = new XmlDocument();

                    //load up the xml from the location 
                    xDoc.Load(sitemap);

                    // cycle through each child noed 
                    foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
                    {
                        // first node is the url ... have to go to nexted loc node 
                        foreach (XmlNode locNode in node)
                        {
                            // thereare a couple child nodes here so only take data from node named loc 
                            if (locNode.Name == "loc")
                            {
                                // get the content of the loc node 
                                string loc = locNode.InnerText;

                                // write it to the console so you can see its working 
                                Console.WriteLine(loc + Environment.NewLine);

                                // write it to the file 
                                sw.Write(loc + Environment.NewLine);
                            }
                        }
                    }
                }
                catch { }
            }
            Console.WriteLine("All Done :-)"); 
            Console.ReadLine(); 
        }

        static void readSitemap()
        {
        }
    }
}

粘贴Bin上的代码 http://pastebin.com/yK7cSNeY

答案 3 :(得分:11)

有很多方法,有些:

  • XmlSerializer的。使用具有目标模式的类 你想读 - 使用XmlSerializer 获取加载到Xml中的数据 一个类的实例。
  • Linq 2 xml
  • XmlTextReader的。
  • 的XmlDocument
  • XPathDocument(只读访问权)

答案 4 :(得分:7)

你可以:

示例在提供的msdn页面上

答案 5 :(得分:7)

Linq to XML.

此外,VB.NET通过编译器提供比C#更好的xml解析支持。如果您有选择和愿望,check it out.

答案 6 :(得分:6)

您可以使用DataSet读取XML字符串。

var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);

为了获取信息而发布此信息。

答案 7 :(得分:2)

例如,查看XmlTextReader类。

答案 8 :(得分:0)

  public void ReadXmlFile()
    {
        string path = HttpContext.Current.Server.MapPath("~/App_Data"); // Finds the location of App_Data on server.
        XmlTextReader reader = new XmlTextReader(System.IO.Path.Combine(path, "XMLFile7.xml")); //Combines the location of App_Data and the file name
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    break;
                case XmlNodeType.Text:
                    columnNames.Add(reader.Value);
                    break;
                case XmlNodeType.EndElement:
                    break;
            }
        }
    }

您可以避免使用第一个语句,只需在XmlTextReader的构造函数中指定路径名即可。

答案 9 :(得分:0)

根据您想要获得的方式,有不同的方式。 XmlDocument比XDocument轻,但如果您希望最小化地验证字符串是否包含XML,那么正则表达式可能是您可以做出的最快和最轻的选择。例如,我已经为我的API实现了使用SpecFlow的Smoke Tests,并且我希望测试其中一个结果是否为任何有效的XML - 然后我会使用正则表达式。但是如果我需要从这个XML中提取值,那么我会用XDocument解析它,以便更快地用更少的代码完成它。或者我会使用XmlDocument,如果我必须使用一个大的XML(有时我使用大约1M行的XML,甚至更多);然后我甚至可以逐行阅读。为什么?尝试在Visual Studio中以私有字节打开超过800MB;即使在制作时你也不应该有超过2GB的物体。你可以用twerk,但你不应该。如果您必须解析包含大量行的文档,则此文档可能是CSV。

我写了这篇评论,因为我看到了XDocument的一些例子。 XDocument不适合大文档,或者只想验证内容是否有效。如果你想检查XML本身是否有意义,那么你需要Schema。

我也低估了建议的答案,因为我认为它本身需要上述信息。想象一下,我需要验证每小时10次的200M XML是否是有效的XML。 XDocument将浪费大量资源。

prasanna venkatesh还声明您可以尝试将字符串填充到数据集中,它也将指示有效的XML。

答案 10 :(得分:0)

如果您要从XML文件中检索特定值

 XmlDocument _LocalInfo_Xml = new XmlDocument();
            _LocalInfo_Xml.Load(fileName);
            XmlElement _XmlElement;
            _XmlElement = _LocalInfo_Xml.GetElementsByTagName("UserId")[0] as XmlElement;
            string Value = _XmlElement.InnerText;