C#读取和访问具有相同名称的xml表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#读取和访问具有相同名称的xml表相关的知识,希望对你有一定的参考价值。
我有一个XML文件,例如:XML Example但是当我用C#读取数据集时,我无法访问所有CD内容。我使用下面的代码
ds.ReadXml(sFilePathAndFileName); //Read Xml file to Dataset
public void GetTitle()
{
sTitle = ds.Tables["CD"].Rows[0]["TITLE"].ToString();
}
我想访问特定的CD内容。例如第三个。我知道如果所有内容都是行,我可以使用行号访问。但有时它可能是另一张桌子。所以CD是一个表,其中有一个嵌套表。我想访问最深的表格元素。
我怎样才能做到这一点?
答案
试试xml linq:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
const string URL = @"https://www.w3schools.com/xml/cd_catalog.xml";
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("TITLE", typeof(string));
dt.Columns.Add("ARTIST", typeof(string));
dt.Columns.Add("COUNTRY", typeof(string));
dt.Columns.Add("COMPANY", typeof(string));
dt.Columns.Add("PRICE", typeof(decimal));
dt.Columns.Add("YEAR", typeof(int));
XDocument doc = XDocument.Load(URL);
foreach (XElement cd in doc.Descendants("CD"))
{
dt.Rows.Add(new object[] {
(string)cd.Element("TITLE"),
(string)cd.Element("ARTIST"),
(string)cd.Element("COUNTRY"),
(string)cd.Element("COMPANY"),
(decimal)cd.Element("PRICE"),
(int)cd.Element("YEAR")
});
}
string[] titles = dt.AsEnumerable().Select(x => x.Field<string>("TITLE")).ToArray();
}
}
}
另一答案
这是Linq的最小代码,易于理解:
XDocument doc = XDocument.Load(FILE_PATH);
//deepest cd element at index 3
var deepestCD = doc.Descendants("CD").Skip(2)
.First(or => !or.Descendants("CD").Any());
//deepest CD element's title
var deepestCdTitle = deepestCD.Element(XName.Get("TITLE"));
它意味着:使用CD
名称获取XML的后代,并获取没有后代的THIRD元素。
你也可以把它写成:
Console.WriteLine(deepestCdTitle);
以上是关于C#读取和访问具有相同名称的xml表的主要内容,如果未能解决你的问题,请参考以下文章
IllegalAnnotationException:两个类具有相同的 XML 类型名称