Цикл по XML - PullRequest
       3

Цикл по XML

2 голосов
/ 03 ноября 2011

Я действительно борюсь с тем, как сделать следующее в моем приложении winforms C #.У меня есть код, который работает в старой базе данных Access с VBA, но мне нужно преобразовать его.

  1. У меня есть XML-файл, который я получаю, в котором содержатся данные транзакции для конкретного пользователя.
  2. У меня также есть список действий, которые хранятся в среде сервера SQL.
  3. Мне нужно пройтись по транзакциям в XML, чтобы увидеть, является ли действие транзакции одним из действий на втором шаге.
  4. Если после просмотра моего списка действий у меня остались какие-либо транзакции.Вернуть количество записей.

Пример XML:

<TransactionsResponse>
- <Transactions>
- <Transaction>
        <AccountId>1</AccountId> 
        <ActionType>test</ActionType> 
   </Transaction>
- <Transaction>
        <AccountId>1</AccountId> 
        <ActionType>blah</ActionType> 
   </Transaction>
- <Transaction>
        <AccountId>1</AccountId> 
        <ActionType>no</ActionType> 
   </Transaction>
- <Transaction>
        <AccountId>1</AccountId> 
        <ActionType>yes</ActionType> 
   </Transaction>
- <Transaction>
        <AccountId>1</AccountId> 
        <ActionType>testing</ActionType> 
   </Transaction>
- <Transaction>
        <AccountId>1</AccountId> 
        <ActionType>lame</ActionType> 
   </Transaction>
  </Transactions>
  </TransactionsResponse>

Итак, мой XML-файл содержит 6 записей, если мой список действий включает следующее:

test
blah

Мне нужноциклически проходить через транзакции и затем список действий, которые приведут к итоговому количеству записей 4.

Я думал, что мог бы сначала пройтись по XML, чтобы получить общее количество записей, а затем пройти по немуеще раз, проверяя действие и, если оно существует, то уменьшите количество моих записей на единицу.

Я новичок в работе с XML в C #, поэтому совершенно не знаю, как поступить.Любые советы или предложения будут великолепны.

Ответы [ 4 ]

2 голосов
/ 03 ноября 2011

Если вы можете использовать Linq to XML, вы можете обратиться к следующей ссылке для примеров кодов / примеров: http://msdn.microsoft.com/en-us/vstudio/bb688087/

2 голосов
/ 03 ноября 2011

Вы можете использовать XDocument для анализа вашего XML.

XDocument doc = XDocument.Parse(xml.ToString());

Получив экземпляр XDocument, вы можете работать с ним для извлечения необходимой информации.

IEnumerable<XElement> transactions = doc.
                                     Descendants("TransactionsResponse").
                                     Descendants("Transactions");
foreach (XElement element in transactions)
{
     String actionType = element.Descendants("ActionType").Single().Value;
     if(myActionTypes.Contains(actionType))
           //do whatever you want since you know the action 
           //type of the transaction now
}
2 голосов
/ 03 ноября 2011

вы захотите начать использовать Linq to Xml

var xmlActions = XElement.Parse(GetXmlString());
IList<string> actionsFromDatabase = GetActionsFromDatabase();

int actionCount = xmlActions.Descendants("Transaction").Count();

foreach (var action in actionsFromDatabase)
            {
                if (xmlActions.Descendants().Any(el => el.Name == "ActionType" && el.Value == action))
                {
                    actionCount--;
                }
            }
1 голос
/ 03 ноября 2011

Я бы предложил использовать Linq и XDocument для выполнения этой работы.

Загрузить XML в XDocument, например var doc = XDocument.Parse(xmlText);

Загрузить действия, которые вы хотите отфильтровать, в список строкили массив:

var stringlist = new List<string>() { "test", "blah" };

Используйте запрос linq для выбора элементов транзакции, которые не соответствуют вашему списку строк:

var q = from transaction in doc.Descendents("Transaction")
        where !stringlist.Contains(transaction.Element("ActionType").Value))
        select transaction;

, а затем подсчитайте выбранные элементы:

return q.Count();

* Примечание: это не в моей голове, код может содержать синтаксические ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...