在 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的主要内容,如果未能解决你的问题,请参考以下文章