【问题标题】:How to parse element with same name at different level in SAX parser java如何在 SAX 解析器 java 中解析不同级别的同名元素
【发布时间】:2017-11-03 05:12:10
【问题描述】:

我有一个像下面这样的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 AdjustmentFactors 标签中添加同名的 cr:ExDate 元素。

现在我有两个 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);
        }

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

请告诉我如何解决这个问题

【问题讨论】:

  • 我建议切换到 StAX,而不是 SAX,因为使用 StAX 更容易跟踪上下文。
  • 您是否想过使用 jibx、castor 或 jaxb 等数据绑定工具?

标签: java xml saxparser


【解决方案1】:

你可以试试这样的:

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)  {
...

【讨论】:

  • 但是这个 booleanType 每次在元素值中都会重新初始化
  • Dividends / AdjustmentFactors 出现在 ExDate 之前,因此当您解析器来到 ExDate 时,sInDivident 设置为正确值
【解决方案2】:

编写 SAX 应用程序并不容易。许多人被更好性能的承诺所吸引,但只有当你精通该领域时,你才能获得更好的性能。大多数最终在 SO 上询问有关 SAX 问题的人可能应该使用不同的工具来完成这项工作。 (但你没有描述任务,所以我们无法判断。)

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

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多