我不确定我是否正确地问这个问题,如果我不是,请原谅我。我对c#和编码很新。我有一些解析xml文档的代码(这是客户的账单)。我遇到了一个我想解决的问题。一位顾客最近搬到另一个地址,导致他被收取两次费用。生成的xml返回了多个相同的节点。因此该法案只有部分使用信息,而不是所有的信息。该代码仅检查一个节点。或者我假设在这种情况下它采用第一个节点并使用该信息。我想要完成的是修改我的代码以检查多个相同的节点。然后能够解析所有节点。
这是我通过账单清单的代码。如果它返回一个节点,那么它将解析来自xml的信息。
以下是检查xml中是否存在节点的方法。如果它大于0则返回节点。我相信我需要更改对象Xmlnode,因为它只代表XML文档中的单个节点。是否有另一个我可以使用的对象代表多个节点?以及如何修改此方法以检查多个节点并将其返回。
然后我相信我需要从我发布的第一个代码段回到代码的这一部分。我想我需要以某种方式将这部分代码放在一个循环中。这样它就会检查所有多个相同的节点。我被困在如何做到这一点
我不能发布图像,因为我是新手并且还没有任何声誉投票,所以我只是打字输出所以你可以看到我在说什么。这通常是xml看起来的样子与一个DetailPage_Section节点一样正常。
我再次对此很新,我正在努力理解并自己解决问题。很抱歉,如果这没有多大意义。
答案 0 :(得分:0)
您想要的功能已经存在,您只需要程序员为您找到的nodes
值!所以你要做的就是删除一些代码并改变你的返回值:
public static XmlNodeList GetDetailPageSectionBySa(string sa, string statementXml)
{
XmlDocument document = new XmlDocument();
document.LoadXml(statementXml);
string requestSa = sa.PadLeft(9, '0');
string xpath = String.Format("//Para[IRBILGP_SA_SAA_ID_PRINT.SERVICE.ACCOUNT.STATMENT='{0}S{1}']/..", requestSa.Substring(0, 4), requestSa.Substring(4));
return document.SelectNodes(xpath);
if(!SaExistInBill(requestSa, statementXml)) return null;
var node = GetDetailPageSectionByBillPrisminfoIndex(sa, statementXml);
if (node != null) return node;
return null;
}
对于同一账单中的所有节点:
var saDetailedPageNodes = XmlBillParser.GetDetailPageSectionBySa(requestSa, xmlBill);
if (saDetailedPageNodes.Count == 0) continue;
var customerBill = new CustomerBill();
customerBill.IsSurepay = XmlBillParser.GetSurepayFlagFromBill(document);
customerBill.ServiceAddress = XmlBillParser.GetServiceAddress(requestSa, document);
customerBill.monthName = XmlBillParser.GetnillStatementDate(requestSa, xmlBill);
customerBill.EqCurlPlanBal = XmlBillParser.getEqualizerCurrentPlanBalance(document);
customerBill.EqPymntDue = XmlBillParser.getEqualizerPaymentDue(document);
for (int i = 0; i < saDetailedPageNodes.Count; i++)
{
// customerBill.Service needs to be an array or list
customerBill.Service.Add(GetServiceAccountUsageAndBillingDetail(requestSa, xmlBill, saDetailedPageNode[i]));
}
response.Add(customerBill);