【问题标题】:Iterating through an Xml can't see the second Child node (C#)遍历 Xml 看不到第二个子节点 (C#)
【发布时间】:2017-11-06 13:14:43
【问题描述】:

我在 2 个 Xml 文档中并行迭代。当来自第一个 Xml 的元素值 X 是 等于第二个 Xml 中的值(例如 USD== USD),它应该写一个 具有两列的 DataTable 中的行。第一列中的元素值 X (USD) 以及来自第二列中第一个 Xml 的另一个子元素值 Y(来自 的值)。 第二个 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" 中得到一个空值 (" ") 并停止,只用 “CharCode” 值。 有趣的是,它在我运行它的前几次都有效,但现在就不行了。

第一个 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>

【问题讨论】:

  • 您需要共享 xmls

标签: c# xml datatable


【解决方案1】:

使用 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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多