C#读取和访问具有相同名称的xml表

问题描述 投票:-1回答:2

我有一个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是一个表,其中有一个嵌套表。我想访问最深的表格元素。

我怎样才能做到这一点?

c# xml dataset
2个回答
0
投票

试试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();

        }
    }
}

0
投票

这是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);
© www.soinside.com 2019 - 2024. All rights reserved.