我有从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 }
答案 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)
实际上有多种方法可以做到这一点。仅举两个。
您可以将此XML反序列化为对象表示。然后呢 访问DataExtValue属性是微不足道的。 XmlSerializer
您可以使用 父节点上的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();
}