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 类型名称

打开 XML 电子表格读取表

具有相同元素名称但属性值不同的XML的XSD架构[关闭]

Hibernate - JPA 在不同的情况下生成具有相同名称的重复表

具有相同元素和属性名称的 RestKit XML 映射

如何使用 JDOM 编写和获取具有相同名称的同一级别的所有 xml 元素