如何在SAX解析器java中的不同级别解析具有相同名称的元素

时间:2017-11-03 05:12:11

标签: java xml saxparser

我有一个xml结构,如下所示

<cr:TRFCoraxData instrumentId="8590925624" organizationId="4296241518">
    <cr:Dividends>
        <cr:ExDate>2017-02-27T00:00:00+00:00</cr:ExDate>
        <cr:PeriodEndDate>2017-03-31T00:00:00+00:00</cr:PeriodEndDate>
        <cr:PeriodDuration>P3M</cr:PeriodDuration>
    </cr:Dividends>


    <cr:AdjustmentFactors>
        <cr:ExDate>2222-05-21T00:00:00+00:00</cr:ExDate>
        <cr:AdjustmentFactor>0.50000</cr:AdjustmentFactor>
    </cr:AdjustmentFactors>

    </cr:TRFCoraxData>

所以我必须在Kand cr:ExDate标记中使用相同名称的元素AdjustmentFactors

现在我有两个pojo类,然后我有开始和结束元素标记。

在我的结尾元素标签中,我有以下条件

 if (element.equals("cr:ExDate")) {
            dividend.setExDate(tmpValue);
        }else if (element.equals("cr:DividendEventId")) {
            dividend.setDividendEventId(tmpValue);
        }else if (element.equals("cr:AnnouncementDate")) {
            dividend.setAnnouncementDate(tmpValue);
        }
else if (element.equals("cr:ExDate")) {
            adjustmentFactorObj.setExDate(tmpValue);
        }else if (element.equals("cr:AdjustmentFactor")) {
            adjustmentFactorObj.setAdjustmentFactor(tmpValue);
        }

显然,对于“cr:ExDate”元素,如果条件满足并且我无法在adjustFactorObj中获取并设置“cr:ExDate”值。

请建议我如何解决这个问题

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

boolean isInDivident;  // it is a field

...

if (element.equals("cr:Dividends")) {
  isInDivident = true;
} else if ((element.equals("cr:AdjustmentFactors")) {
  isDivident = false;
} else if (element.equals("cr:ExDate") && isInDivident)  {
...

答案 1 :(得分:0)

编写SAX应用程序并不容易。很多人都被更好的表现所吸引,但如果你是本领域的高技能人员,你只会获得更好的表现。大多数最终在SO上询问有关SAX的问题的人可能应该使用不同的工具来完成工作。 (但你没有描述任务,所以我们无法判断。)

在任何情况下,当您使用SAX时,您有责任跟踪上下文。对于大多数情况,堆栈保存元素名称就足够了:在startElement事件中将元素名称推送到堆栈,将其弹出endElement event。在这种情况下,当ExDate到达时,确定其父元素是足够的。