如何读取和parsingC#中的XML文件?
如何读取和parsingC#中的XML文件?
XmlDocument从string或从文件读取XML。
XmlDocument doc = new XmlDocument(); doc.Load("c:\\temp.xml");
要么
doc.LoadXml("<xml>something</xml>");
然后find它下面的节点就是这样
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
总是在属性[“something”]上检查null,因为如果该属性不存在,它将为空。
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
这里是我写的阅读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
有很多方法,一些:
- XmlSerializer的。 使用具有要读取的目标模式的类 – 使用XmlSerializer将Xml中的数据加载到类的实例中。
- Linq 2 xml
- XmlTextReader的。
- 的XmlDocument
- XPathDocument(只读访问)
Linq到XML。
另外,VB.NET通过编译器支持比C#更好的xmlparsing支持。 如果你有select和愿望, 检查出来。
你可以:
- 使用XmlSerializer类
- 使用XmlDocument类
例子在提供的msdn页面上
例如检查XmlTextReader类。
您可以使用DataSet来读取XMLstring。
var xmlString = File.ReadAllText(FILE_PATH); var stringReader = new StringReader(xmlString); var dsSet = new DataSet(); dsSet.ReadXml(stringReader);
为了信息而张贴此信息。
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的构造函数中指定path名称即可。
有不同的方式,取决于你想得到的地方。 XmlDocument比XDocument轻,但是如果您希望简单地validation一个string是否包含XML,则正则expression式可能是您可以做出的最快,最轻的select。 例如,我已经使用SpecFlow为我的API实施了烟雾testing,我希望testing是否有任何有效的XML中的结果 – 然后我将使用正则expression式。 但是,如果我需要从这个XML中提取值,那么我将使用XDocumentparsing它,以便更快速地执行代码。 或者我会使用XmlDocument,如果我必须使用一个大的XML(有时我使用大约1M行的XML,甚至更多)。 那么我甚至可以逐行阅读。 为什么? 尝试在Visual Studio中打开超过800MB的专用字节; 即使在生产中,也不应该有大于2GB的对象。 你可以用twerk,但你不应该。 如果你将不得不parsing一个文件,其中包含很多行,那么这个文件可能是CSV。
我写了这个评论,因为我看到了很多XDocument的例子。 XDocument不适合大文档,或者当您只想validation内容是否为XML有效时。 如果你想检查XML本身是否有意义,那么你需要Schema。
我也低估了build议的答案,因为我认为它需要上面的信息。 想象一下,我需要validation200M的XML,每小时10次,是否是有效的XML。 XDocument会浪费大量的资源。
prasanna venkatesh也声明你可以尝试填充string到数据集,它也会指示有效的XML。