Foreach通过不同的xml节点

时间:2017-08-08 09:29:27

标签: c# xml quickbooks

我有从QuickBooks返回的XML响应。在这里我要做的是我需要更新" LISTID"它位于" CustomerRet"中,基于" DataExtValue" " DataExtRet"中的ID" 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 }

3 个答案:

答案 0 :(得分:1)

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

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了解演示。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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();
}