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


Answers:


480

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
有效,但是Linq to XML更好。
Finglas 2010年

3
尽管您说它“更聪明”,但与LINQ相比,这样做还有其他缺点吗?我个人认为这种方法最简单,至少满足我的需要。
Kolors

6
我在开始使用LINQ之前就写了这篇文章。LINQ很不错,并且可读性更强。这些天我大部分时间都在使用LINQ。但是某些组件确实需要旧样式的XML对象,因此仍然时不时地使用它。我建议在这里和LINQ都尝试“旧样式”,然后看看适合您的情况。
Wolf5

1
如果不是XmlNode node = XmlDocument.Docu...行真的XmlNode = doc.Docu...?为什么更改答案并将其doc.删除?
wasatchwizard 2014年

真正。我不知道为什么我改变了...将解决。
Wolf5 2014年

217

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


16
XDocument.Parse(“ <xml> something </ xml>”); 一个字符串。
Wolf5 2015年

2
不包括include的人是卑鄙的,谢谢您的回答:)
Gabriel Garcia

@GabrielGarcia是的,有时候初学者会因为缺少包含错误而陷入困境
匿名

1
相关内容包括什么?
sayth

18

这是我编写的用于读取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()
        {
        }
    }
}

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


12

有很多方法,一些:

  • XmlSerializer。将类与要读取的目标架构一起使用-使用XmlSerializer可以将Xml中的数据加载到该类的实例中。
  • Linq 2 XML
  • XmlTextReader。
  • XmlDocument
  • XPathDocument(只读访问)

2
从.NET 2.0开始,实际上是XmlReader.Create而不是直接使用XmlTextReader。
约翰·桑德斯


7

Linq到XML。

而且,与C#相比,VB.NET通过编译器具有更好的xml解析支持。如果您有选择和欲望,请检查一下。


“都错了”吗?我认为应该是不准确的,除非那句话是开玩笑的。OP未提供任何信息。关于他工作的.NET版本。
Cerebrus

1
嗯是的 这是在开玩笑,但我并不好笑,所以我删除了它。

7

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

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

为了提供信息而发布此信息。


很好!这是我发现共享sql xml列和.net信息的最快方法!
elle0087 '18

当您具有多个级别时,这并不理想,因为它似乎会将每个级别放入数据集中的自己的表中。
Lenny K

即使这样也很好。我猜这实际上取决于您的数据实际看起来是什么样,以及要处理的数据深度为几层。
user2366842 '19


1
  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的构造函数中指定路径名。


0

有多种方法,具体取决于您要去的地方。XmlDocument比XDocument轻,但是如果您希望以最小的方式验证字符串包含XML,则正则表达式可能是您可以做出的最快和最轻的选择。例如,我已经为我的API实现了带有SpecFlow的冒烟测试,并且希望测试任何有效XML中的结果之一-然后我将使用正则表达式。但是,如果我需要从该XML中提取值,则可以使用XDocument对其进行解析,以更快,更少的代码完成它。或者,如果必须使用大型XML(有时我使用的是大约100万行的XML,甚至更多),我会使用XmlDocument。我什至可以逐行阅读。为什么?尝试在Visual Studio中以私有字节打开800MB以上的内存;即使在生产中,您也不能拥有大于2GB的对象。您可以使用twerk,但您不可以。如果您必须分析包含很多行的文档,则该文档可能是CSV。

我写了此评论,因为我看到了XDocument的大量示例。XDocument不适用于大型文档,或者仅用于验证内容是否为XML有效时。如果您希望检查XML本身是否有意义,则需要Schema。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.