【问题标题】:Looping through XML通过 XML 循环
【发布时间】:2011-11-04 03:21:53
【问题描述】:

我真的很纠结如何在我的 winforms C# 应用程序中完成以下任务。我的代码可以在带有 VBA 的旧 Access 数据库中工作,但我需要对其进行转换。

  1. 我收到一个 XML 文件,其中包含特定用户的交易数据。
  2. 我还有一个存储在 SQL Server 环境中的操作列表。
  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 以获得总记录数,然后再次循环遍历它,检查操作是否存在,然后将我的记录数减一。

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

【问题讨论】:

  • 您正在使用哪个版本的 C# 进行编程?如果您使用的是 C# 3.0 或更高版本,则可以使用 Linq To Xml API 处理 XML。
  • @PawanMishra:重要的不是 C# 版本,而是您所针对的 .NET 版本。您可能在 VS2010 中使用 C# 4,但针对 .NET 2,您将无法使用 LINQ to XML...

标签: c# xml winforms loops


【解决方案1】:

你会想要开始使用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--;
                }
            }

【讨论】:

  • 我们都给出了基本相同的答案,但没有人投赞成票,为什么不呢?它是免费的!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-02
        • 2020-07-26
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        相关资源
        最近更新 更多