2017-08-08 51 views
0

我有从QuickBooks返回的XML响应。这里我想要做的是我需要根据“DataExtRet”中的“DataExtValue”ID更新“CustomerRet”中的“LISTID”。这个“DataExtValue”ID已经存在于我的数据库中。我需要读取值“listId”和“dataextvalue”。如何循环这些值?通过不同xml节点的Foreach

下面是我的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 }
+0

目前还不清楚'CustomerAddRs'与'DataExtModRs'的关系。是否有一些元素值“加入”,还是仅仅因为他们是兄弟姐妹而相关? –

+0

这两者之间没有实际关系。在发送请求时,我以这样一种方式形成XML,即“Dataextvalue”只是应该在相关客户列表项目旁边的自定义数据。所以作为响应,我以相同顺序获取它。 –

+0

如果有一种方法可以在客户请求中发送自定义数据,我真的很高兴。但这在API中是不可能的。 –

回答

0

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

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

  2. 您可以使用在parentnode一个 XPath表达式得到DataExtValue的价值。 Xpath

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

我试图通过string.when读取XML,当我尝试通过您的代码时,我得到一个错误为“路径中的无效字符”。 –

+0

@satepuritarun我怀疑你将XML字符串传递给'Load'而不是文件的路径。如果是这样的话,你需要'XDocument.Parse'。 –

+0

是的,我试过了,但它并没有循环遍历所有元素。它仅为第一个客户返回值。 –

1

您可以使用LINQ到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的演示。

+0

感谢队友,它工作正常。 –