迭代Xml无法看到第二个子节点(C#)

时间:2017-11-05 19:32:46

标签: c# xml datatable

我在2个Xml文档中并行迭代。当第一个Xml的元素值X是 等于第二个Xml(例如USD == USD)中的值,它应该写一个 具有两列的DataTable中的行。第一列中的元素值X(USD) 和第二个col中第一个Xml的另一个子元素值Y(值from)。 第二个Xml有一个包含多个元素的节点。

DataTable dTable = new DataTable();
dTable.Columns.Add("ColumnOne");
dTable.Columns.Add("ColumnTwo");
DataRow dRow = null;

foreach (XmlNode nodeFirst in firstXmlDoc.SelectNodes("//ValCurs/Valute")) 
{
    foreach (XmlNode nodeSecond in secondXmlDoc.SelectSingleNode("SelectedVal"))
    {
        if (nodeFirst.SelectSingleNode("CharCode").InnerText == nodeSecond.InnerText)
        {
            dRow = dTable.NewRow();
            dRow["ColumnOne"] = nodeFirst.SelectSingleNode("CharCode").InnerText;
            dRow["ColumnTwo"] = nodeFirst.SelectSingleNode("Value").InnerText;
            dTable.Rows.Add(dRow);
        }
    }
}
myDataGridView.DataSource = dTable;

这不起作用,我进入" nodeFirst.SelectSingleNode(" Value")。InnerText" 一个空值(&#34) ;")然后停止,只使用" CharCode" 值填充DataTable。 有趣的是,它在我运行它的前几次起作用,但它已经不存在了。

第一个Xml:

<ValCurs>
    <Valute ID="47">
        <NumCode>978</NumCode>
        <CharCode>EUR</CharCode>
        <Nominal>1</Nominal>
        <Name>Euro</Name>
        <Value>20.3457</Value>
    </Valute>
    <Valute ID="44">
        <NumCode>840</NumCode>
        <CharCode>USD</CharCode>
        <Nominal>1</Nominal>
        <Name>Dolar S.U.A.</Name>
        <Value>17.4603</Value>
    </Valute>
    ...
</ValCurs>

第二个Xml:

<SelectedVal>
    <Cod>UAH</Cod>
    <Cod>EUR</Cod>
    <Cod>CAD</Cod>
    <Cod>RON</Cod>
    <Cod>NOK</Cod>
    <Cod>RUB</Cod>
    <Cod>JPY</Cod>
    <Cod>AUD</Cod>
</SelectedVal>

1 个答案:

答案 0 :(得分: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 CURRENCY_FILE = @"c:\temp\test.xml";
        const string COUNTRY_FILE = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {

            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("NUMCODE", typeof(int));
            dt.Columns.Add("CHARCODE", typeof(string));
            dt.Columns.Add("Nominal", typeof(int));
            dt.Columns.Add("Name", typeof(string));
            dt.Columns.Add("Value", typeof(decimal));


            XDocument currencyXml = XDocument.Load(CURRENCY_FILE);

            List<XElement> valutes = currencyXml.Descendants("Valute").ToList();

            foreach (XElement valute in valutes)
            {
                dt.Rows.Add(new object[] {
                    (int)valute.Attribute("ID"),
                    (int)valute.Element("NumCode"),
                    (string)valute.Element("CharCode"),
                    (int)valute.Element("Nominal"),
                    (string)valute.Element("Name"),
                    (decimal)valute.Element("Value")
                });
            }

            XDocument countryXml = XDocument.Load(COUNTRY_FILE);

            List<string> countries = countryXml.Descendants("Cod").Select(x => (string)x).ToList();

            DataTable filteredTable = dt.AsEnumerable().Where(x => countries.Contains(x.Field<string>("CharCode"))).CopyToDataTable();
        }
    }
}