Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在XML中循环_C#_Xml_Winforms_Loops - Fatal编程技术网

C# 在XML中循环

C# 在XML中循环,c#,xml,winforms,loops,C#,Xml,Winforms,Loops,我真的很难在我的winforms C应用程序中实现以下功能。我有一些代码可以在一个使用VBA的旧Access数据库中工作,但我需要转换它 我收到一个XML文件,其中包含特定用户的事务数据 我还有一个存储在SQL server环境中的操作列表 我需要遍历XML中的事务,以查看事务的操作是否是第二步中的操作之一 如果在遍历我的操作列表后,我还有任何事务。返回记录计数 示例XML: <TransactionsResponse> - <Transactions> - <Tr

我真的很难在我的winforms C应用程序中实现以下功能。我有一些代码可以在一个使用VBA的旧Access数据库中工作,但我需要转换它

  • 我收到一个XML文件,其中包含特定用户的事务数据
  • 我还有一个存储在SQL server环境中的操作列表
  • 我需要遍历XML中的事务,以查看事务的操作是否是第二步中的操作之一
  • 如果在遍历我的操作列表后,我还有任何事务。返回记录计数 示例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>
    
    我需要遍历事务,然后遍历操作列表,这将导致最终记录计数为4

    我在想,我可以先遍历XML以获得总记录计数,然后再次遍历它,检查操作,如果它存在,然后将记录计数减少一


    我对在C#中使用XML还不熟悉,所以我完全不知道如何继续。任何建议都会很好。

    您将希望开始使用

    var-xmlActions=XElement.Parse(GetXmlString());
    IList actionsFromDatabase=GetActionsFromDatabase();
    int actionCount=xmlActions.substands(“事务”).Count();
    foreach(actionsFromDatabase中的var操作)
    {
    if(xmlActions.subjects().Any(el=>el.Name==“ActionType”&&el.Value==action))
    {
    行动计数--;
    }
    }
    
    如果您可以使用Linq to XML,那么您可以参考以下链接获取示例代码/示例:

    您可以使用
    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
    }
    
    IEnumerable transactions=doc。
    子体(“TransactionResponse”)。
    子公司(“交易”);
    foreach(事务中的XElement元素)
    {
    字符串actionType=element.substands(“actionType”).Single().Value;
    if(myActionTypes.Contains(actionType))
    //既然你知道行动,你想做什么就做什么
    //现在交易的类型
    }
    
    我建议使用Linq和XDocument来执行这项工作

    将XML加载到XDocument中,如
    var doc=XDocument.Parse(xmlText)

    将要筛选的操作加载到字符串列表或数组中:

    var stringlist = new List<string>() { "test", "blah" };
    
    然后计算所选项目的数量:

    return q.Count();
    

    *注意:这是我不知道的,代码可能包含语法错误。

    您正在使用哪个版本的C#进行编程?如果您使用的是C#3.0或更高版本,那么您可以使用Linq To Xml API来处理Xml。@PawanMishra:重要的不是C#的版本,而是针对的.NET版本。你可以在VS2010中使用C#4,但目标是.NET2,你将无法使用LINQtoXML…我们给出了基本相同的答案,但没有人投票,为什么不呢?它是免费的!
    var stringlist = new List<string>() { "test", "blah" };
    
    var q = from transaction in doc.Descendents("Transaction")
            where !stringlist.Contains(transaction.Element("ActionType").Value))
            select transaction;
    
    return q.Count();