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

Posted

技术标签:

【中文标题】在 SAX 中将属性从 startElement 传递到 EndElement【英文标题】:Passing Attributes from startElement to EndElement in SAX 【发布时间】:2015-11-13 01:59:52 【问题描述】:

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

<wrappercell borderWidth="0.9f" border="NO_BORDER" colSpan="1">
        <phrase font="BOLD_ARIAL">
          <token>1234</token>
        </phrase>
</wrappercell>

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

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

在我们的 EndElement 中,我们想引用我们在 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());
  


这对于 getLength() 总是返回零。我们引用另一个Ques,它说属性对象在每个起始元素处具有相同的实例。

除了下面我们尝试过的选项之外,是否还有其他选项可以引用 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());
  


【问题讨论】:

elementAttribute 来自哪里?你似乎在分享它。您需要分配一个新实例以推送到您的堆栈中。 我们正在创建一个名为 elementattribute 的 hashmap,以便我们可以访问 startelement 和 end element 之间的值。它按预期工作。但是我们想有没有其他方法可以解决这个问题? 【参考方案1】:

不是直接回答您的问题,但使用 StAX 而不是 SAX 更容易解决此类问题。

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

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

两者都附带 Java 7。

【讨论】:

以上是关于在 SAX 中将属性从 startElement 传递到 EndElement的主要内容,如果未能解决你的问题,请参考以下文章

How to parse Xml file -- SAX!

使用 SAX 解析器时如何获取父节点?

java使用sax解析xml

SAX 解析器从 endelement 获取属性

使用 SAX Parser,获取属性的值

无法覆盖 startElement 方法