通过XML循环

时间:2011-11-03 17:17:03

标签: c# xml winforms loops

我真的在如何在winforms C#应用程序中完成以下操作。我的代码在VBA的旧Access数据库中工作,但我需要转换它。

  1. 我收到的XML文件包含特定用户的交易数据。
  2. 我还有一个存储在SQL Server环境中的操作列表。
  3. 我需要循环遍历XML中的事务,以查看事务的操作是否是第二步中的操作之一。
  4. 如果在循环执行操作列表后,我还剩下任何交易。返回记录计数。
  5. 示例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以获取总记录数,然后再次循环,检查操作以及是否存在,然后将记录计数减一。

    我是C#中使用XML的新手,所以我完全不知道如何继续。任何建议或建议都会很棒。

4 个答案:

答案 0 :(得分:2)

您需要开始使用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 :(得分:2)

如果您可以使用Linq to XML,那么您可以参考以下链接获取示例代码/示例:http://msdn.microsoft.com/en-us/vstudio/bb688087/

答案 2 :(得分:2)

您可以使用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
}

答案 3 :(得分:1)

我建议使用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();

*注意:这不在我的脑海中,代码可能包含语法错误。