在SAX中将属性从startElement传递到EndElement

时间:2015-08-19 16:36:37

标签: java xml-parsing attributes itext sax

我们正在尝试使用SAX Parser解析XML。 我们的环境: Java版本:1.7

public void startElement(String uri, String localName, String qName, Attributes attributes){
  if("wrappercell".equals(qName)){
     elemenstack.push(attributes);
  }else if("phrase".equals(qName)){
     elemenstack.push(attributes);
  }
}

在我们的startElement中,我们正在执行以下操作

public void endElement(String uri, String localName, String qName) throws SAXException {
  if("wrappercell".equals(qName)){
     System.out.println(((Attributes)elemenstack.pop()).getLength());
  }else if("phrase".equals(qName)){
     System.out.println(((Attributes)elemenstack.pop()).getLength());
  }

}

在我们的EndElement中,我们想要引用在startelement

期间推送的属性
public void startElement(String uri, String localName, String qName, Attributes attributes){
  if("wrappercell".equals(qName)){
     elementAttribute.put(attribute.getQName(1),attributes.getValue(1));
     elemenstack.push(elementAttribute);

  }else if("phrase".equals(qName)){
    elementAttribute.put(attribute.getQName(1),attributes.getValue(1));
     elemenstack.push(elementAttribute);

  }
}

public void endElement(String uri, String localName, String qName) throws SAXException {
  if("wrappercell".equals(qName)){
     System.out.println(((HashMap<String,String>)elemenstack.pop()).size());
  }else if("phrase".equals(qName)){
     System.out.println(((HashMap<String,String>)elemenstack.pop()).size());
  }

}

getLength()始终返回零。我们引用另一个Ques,它表示属性对象在每个startelement上具有相同的实例。

我们尝试过以下选项以外的其他选项,以便我们可以在功能中引用startelement值;

我们的解决方案

{{1}}

1 个答案:

答案 0 :(得分:0)

不能直接回答您的问题,但使用StAX代替SAX会更容易解决这类问题。

SAX是一个推送解析器,意味着它会通过执行您的回调方法将事件推送给您。

StAX是一个拉解析器,意味着您从流中请求下一个事件。这允许您在代码中使用调用堆栈来控制“上下文”。

两者都附带Java 7。