什么对象可以读取多个节点

时间:2015-07-01 14:32:17

标签: c# xml

我不确定我是否正确地问这个问题,如果我不是,请原谅我。我对c#和编码很新。我有一些解析xml文档的代码(这是客户的账单)。我遇到了一个我想解决的问题。一位顾客最近搬到另一个地址,导致他被收取两次费用。生成的xml返回了多个相同的节点。因此该法案只有部分使用信息,而不是所有的信息。该代码仅检查一个节点。或者我假设在这种情况下它采用第一个节点并使用该信息。我想要完成的是修改我的代码以检查多个相同的节点。然后能够解析所有节点。

这是我通过账单清单的代码。如果它返回一个节点,那么它将解析来自xml的信息。

以下是检查xml中是否存在节点的方法。如果它大于0则返回节点。我相信我需要更改对象Xmlnode,因为它只代表XML文档中的单个节点。是否有另一个我可以使用的对象代表多个节点?以及如何修改此方法以检查多个节点并将其返回。

然后我相信我需要从我发布的第一个代码段回到代码的这一部分。我想我需要以某种方式将这部分代码放在一个循环中。这样它就会检查所有多个相同的节点。我被困在如何做到这一点

我不能发布图像,因为我是新手并且还没有任何声誉投票,所以我只是打字输出所以你可以看到我在说什么。这通常是xml看起来的样子与一个DetailPage_Section节点一样正常。

我再次对此很新,我正在努力理解并自己解决问题。很抱歉,如果这没有多大意义。

1 个答案:

答案 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);