Я пытаюсь просмотреть список дочерних узлов в главном узле, и у меня есть список дочерних узлов в XMLNodeList. Я успешно прошел через него, и эта часть кода работает, но он выберет только первый узел NodeList, поскольку я использую SelectSingleNode. Мне нужен обходной путь для этой проблемы, чтобы перебрать каждый отдельный узел XML в NodeList и выбрать из него некоторые дочерние атрибуты. Я безуспешно пытался удалить каждый узел, пока просматривал его, я немного изучил SelectNodes, но все они имеют одинаковое имя; единственная реальная разница - это дата. Какие-либо предложения?
Код:
XmlNode TransactionMain = XMLFromServer.SelectSingleNode("");
XmlNodeList TransactionsNodeList = TransactionMain.ChildNodes;
foreach(XmlNode TransactionsSingleNode in TransactionsNodeList) {
//Finding all of the pertinent information for the Transactions table from EACH node (note the foreach loop) inside the bigger Transaction node
string SalesTaxAmount = TransactionsSingleNode.SelectNodes("").Value;
string PaymentAmount = TransactionsSingleNode.SelectSingleNode("").Value;
string RecurringProfileID = TransactionsSingleNode.SelectSingleNode("").Value;
string TransactedDateTime = TransactionsSingleNode.SelectSingleNode("").Value;
string NumberOfDays = TransactionsSingleNode.SelectSingleNode("").Value;
string LicenseSizeDescriptionTransactionsList = TransactionsSingleNode.SelectSingleNode("").Value;
Transactions.Rows.Add(CompanyName, SalesTaxAmount, PaymentAmount, RecurringProfileID, TransactedDateTime, NumberOfDays, LicenseSizeDescriptionTransactionsList);
Переменная CompanyName взята из другого места, и она отлично работает. е Я удалил выражения XPath, поскольку они содержали немного личной информации. Если нужно, я могу их снова вставить. XML:
<Authorization LicenseDaysLeft = "22" LicenseEndDate = "2018-11-17" LicenseSizeDescription = "" LicenseSizeCode = "1">
<Paypal LastEmailUsed = "" RecurringProfileID = "" LastTransactionDateTime = "">
<Transactions>
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-10-18 07:54" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-09-18 08:19" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-08-19 00:38" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-07-20 09:16" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-06-20 01:24" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-05-21 09:06" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-04-19 08:31" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-03-13 08:58" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-02-11 08:22" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2018-01-17 10:22" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-12-13 10:08" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-11-13 12:04" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-10-14 10:18" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-09-20 07:14" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-08-22 23:52" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-07-21 08:36" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-06-24 08:58" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-05-24 11:24" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-04-17 16:42" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-03-18 09:02" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-02-16 15:08" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2017-01-23 09:13" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2016-12-24 18:07" NumberOfDays = "30" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2016-11-23 16:09" NumberOfDays = "0" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2016-10-24 14:37" NumberOfDays = "0" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2016-09-24 15:58" NumberOfDays = "0" LicenseSize = "0" LicenseSizeDescription = "" />
<Transaction SalesTaxAmount = "0.00" PaymentAmount = "0.00" RecurringProfileID = "" TransactedDateTimeUTC = "0001-01-01 00:00" TransactedDateTime = "2016-08-25 16:48" NumberOfDays = "0" LicenseSize = "0" LicenseSizeDescription = "" />
</Transactions>
</Paypal>
</Authorization>
Попытка перебрать каждую транзакцию и добавить ее в таблицу. Он выберет только первый.
С 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 FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("SalesTaxAmount", typeof(decimal));
dt.Columns.Add("PaymentAmount", typeof(decimal));
dt.Columns.Add("RecurringProfileID", typeof(string));
dt.Columns.Add("TransactedDateTimeUTC", typeof(DateTime));
dt.Columns.Add("TransactedDateTime", typeof(DateTime));
dt.Columns.Add("NumberOfDays", typeof(int));
dt.Columns.Add("LicenseSize", typeof(int));
dt.Columns.Add("LicenseSizeDescription = ", typeof(string));
XDocument doc = XDocument.Load(FILENAME);
foreach(XElement transaction in doc.Descendants("Transaction"))
{
dt.Rows.Add(new object[] {
(decimal?)transaction.Attribute("SalesTaxAmount"),
(decimal?)transaction.Attribute("PaymentAmount"),
(string)transaction.Attribute("RecurringProfileID"),
(DateTime)transaction.Attribute("TransactedDateTimeUTC"),
(DateTime)transaction.Attribute("TransactedDateTime"),
(int?)transaction.Attribute("NumberOfDays"),
(int)transaction.Attribute("LicenseSize"),
(string)transaction.Attribute("LicenseSizeDescription")
});
}
}
}
}
Я очень ценю помощь, поздний ответ, так как я был занят в школе. Потребовалось немного времени, чтобы адаптировать код, но это сработало; Мне просто нужно было запустить функцию в конце кода, чтобы преобразовать все нули в синтаксическую строку для веб-браузера.
Вы имеете в виду целые числа и десятичные нули? Вы хотите, чтобы они были равны нулю? Или, может быть, сделайте значения строками вместо числа.
Мне удалось заставить его работать. Пришлось выполнить половину цикла в Linq, в XElement, а другую половину в C#.
Использование более новой библиотеки XML Linq обычно дает лучшие результаты. Вы не разместили xml, поэтому я действительно не могу помочь.