2017-08-08 53 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

感謝隊友,它工作正常。 –