【问题标题】:Foreach through different xml nodes通过不同的xml节点进行foreach
【发布时间】:2017-08-08 09:29:27
【问题描述】:

我有一个从 QuickBooks 返回的 XML 响应。在这里,我要做的是我需要根据“DataExtRet”中的“DataExtValue”ID 更新“CustomerRet”中的“LISTID”。这个“DataExtValue”ID 已经存在于我的数据库中。我需要读取“listId”和“dataextvalue”这两个值。如何遍历这些值?

下面是我的 XML

<?xml version="1.0" ?>
<QBXML>
<QBXMLMsgsRs>
<CustomerAddRs statusCode="0" statusSeverity="Info" statusMessage="Status 
OK">
<CustomerRet>
<ListID>8000002B-1502038359</ListID>
<TimeCreated>2017-08-06T22:22:39+05:30</TimeCreated>
<TimeModified>2017-08-06T22:22:39+05:30</TimeModified>
<EditSequence>1502038359</EditSequence>
<Name>MVK -C17</Name>
<FullName>MVK -C17</FullName>
<IsActive>true</IsActive>
<Sublevel>0</Sublevel>
<Balance>0.00</Balance>
<TotalBalance>0.00</TotalBalance>
<JobStatus>None</JobStatus>
<PreferredDeliveryMethod>None</PreferredDeliveryMethod>
</CustomerRet>
</CustomerAddRs>

<DataExtModRs statusCode="0" statusSeverity="Info" statusMessage="Status OK">
<DataExtRet>
<OwnerID>0</OwnerID>
<DataExtName>Category</DataExtName>
<DataExtType>STR255TYPE</DataExtType>
<DataExtValue>1319</DataExtValue>
</DataExtRet>
</DataExtModRs> 

<CustomerAddRs statusCode="0" statusSeverity="Info" statusMessage="Status 
OK">
<CustomerRet>
<ListID>8000002C-1502038359</ListID>
<TimeCreated>2017-08-06T22:22:39+05:30</TimeCreated>
<TimeModified>2017-08-06T22:22:39+05:30</TimeModified>
<EditSequence>1502038359</EditSequence>
<Name>Mutex-C17</Name>
<FullName>Mutex-C17</FullName>
<IsActive>true</IsActive>
<Sublevel>0</Sublevel>
<Balance>0.00</Balance>
<TotalBalance>0.00</TotalBalance>
<JobStatus>None</JobStatus>
<PreferredDeliveryMethod>None</PreferredDeliveryMethod>
</CustomerRet>
</CustomerAddRs>

<DataExtModRs statusCode="0" statusSeverity="Info" statusMessage="Status 
OK">
<DataExtRet>
<OwnerID>0</OwnerID>
<DataExtName>Category</DataExtName>
<DataExtType>STR255TYPE</DataExtType>
<DataExtValue>1524</DataExtValue>
</DataExtRet>
</DataExtModRs>
</QBXMLMsgsRs>
</QBXML>

这是我的 C# 代码

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.LoadXml(response);

XmlNodeList parentNode = xmlDoc.GetElementsByTagName("CustomerRet"); XmlNodeList customnode = xmlDoc.GetElementsByTagName("DataExtRet");

foreach (XmlNode childrenNode in parentNode) { cust.CustomerListID = childrenNode.SelectSingleNode("ListID").InnerText; //Here I need to get the DataExtValue which is in customnode }

【问题讨论】:

  • 尚不清楚CustomerAddRsDataExtModRs 的关系。是否有一些元素值可以“加入”,还是仅仅因为它们是兄弟姐妹而相关?
  • 这两者之间没有实际关系。在发送请求时,我正在以“Dataextvalue”的方式形成 XML,它只不过是应该位于相关客户列表项旁边的自定义数据。因此,作为响应,我以相同的顺序获取它。
  • 如果有一种方法可以在客户请求中发送自定义数据,我真的很高兴。但这在 API 中是不可能的。

标签: c# xml quickbooks


【解决方案1】:

您可以使用 LINQ to XML。下面的查询找到了您当前循环的CustomerAddRs 元素之后的第一个DataExtValue

var doc = XDocument.Parse(xml);

foreach (var customerAddrs in doc.Descendants("CustomerAddRs"))
{
    var listId = customerAddrs
        .Elements("CustomerRet")
        .Elements("ListID")
        .Single();

    var dataExtValue = (int) customerAddrs
        .ElementsAfterSelf("DataExtModRs")
        .Descendants("DataExtValue")
        .First();

    listId.Value = $"New-ID-Based-On-{dataExtValue}";
}

请参阅this fiddle 以获取演示。

【讨论】:

    【解决方案2】:

    实际上有多种方法可以做到这一点。仅举两个。

    1. 您可以将此 XML 反序列化为对象表示。然后它 访问 DataExtValue 属性将是微不足道的。 XmlSerializer

    2. 您可以使用 父节点上的 XPath 表达式以获取 DataExtValue 的值。 Xpath

    【讨论】:

      【解决方案3】:
      XDocument xDocument = XDocument.Load(file);
      
      foreach (var trans in xDocument.Descendants("QBXMLMsgsRs"))
      {    
          var val1 =
              (string)trans.Descendants("CustomerRet").Elements("ListID")
              .First();
          var val2 =  
              (string)trans.Descendants("DataExtRet").Elements("DataExtValue")
              .First();
      }
      

      【讨论】:

      • 我正在尝试通过字符串读取 XML。当我尝试通过您的代码时,我收到“路径中的无效字符”错误。
      • @satepuritarun 我怀疑您将 XML 字符串传递给 Load 而不是文件的路径。如果是这种情况,您需要 XDocument.Parse
      • 是的,我试过了。但它并没有遍历所有元素。它只为第一个客户返回值。
      猜你喜欢
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      相关资源
      最近更新 更多