使用 SAX 解析器时如何获取父节点?
Posted
技术标签:
【中文标题】使用 SAX 解析器时如何获取父节点?【英文标题】:How can I get parent node while i using SAX parser? 【发布时间】:2012-01-28 12:31:48 【问题描述】:我需要在 java 中使用 SAX 解析器来解析文档。如果我使用传统上实现 startElement、endElement 和 characters 方法的 DefaultHandler 类,我能够打印所有节点值。我们如何才能访问子节点的前一个节点值,我该怎么做? 我的示例 XML 是:
<staff>
<firstname>yong</firstname>
<lastname>mook kim</lastname>
<nickname>mkyong</nickname>
<salary>100000</salary>
</staff>
<staff>
<firstname>low</firstname>
<lastname>yin fong</lastname>
<nickname>fong fong</nickname>
<salary>200000</salary>
</staff>
基于薪水节点值,我还想访问名字。我很迷惑。我们该怎么做?我的示例代码:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler()
boolean bfname = false;
boolean blname = false;
boolean bnname = false;
boolean bsalary = false;
public void startElement(String uri, String localName,String qName,
Attributes attributes) throws SAXException
System.out.println("Start Element :" + qName);
if (qName.equalsIgnoreCase("FIRSTNAME"))
bfname = true;
if (qName.equalsIgnoreCase("LASTNAME"))
blname = true;
if (qName.equalsIgnoreCase("NICKNAME"))
bnname = true;
if (qName.equalsIgnoreCase("SALARY"))
bsalary = true;
public void endElement(String uri, String localName,
String qName) throws SAXException
System.out.println("End Element :" + qName);
public void characters(char ch[], int start, int length) throws SAXException
if (bfname)
System.out.println("First Name : " + new String(ch, start, length));
bfname = false;
if (blname)
System.out.println("Last Name : " + new String(ch, start, length));
blname = false;
if (bnname)
System.out.println("Nick Name : " + new String(ch, start, length));
bnname = false;
if (bsalary)
//System.out.println("Salary : " + new String(ch, start, length));
String nodeValue=new String(ch, start, length);
if(nodeValue.compareTo("100000")==0)
**????I need to store the respective respective first name
in ArrayList**
bsalary = false;
;
【问题讨论】:
【参考方案1】:使用 SAX 时,您无法来回导航。您应该尝试使用 DOM。如果您必须使用 SAX,那么您可以使用 Stack
来保存以前的数据并根据需要弹出它们。
【讨论】:
【参考方案2】:您可以使用字符串变量将名称存储为
public void characters(char ch[], int start, int length) throws SAXException
... Code Here ...
if (bfname)
employeeName = new String(ch, start, length);
bfname = false;
... Code Here ...
& 在最后使用这个变量作为
public void characters(char ch[], int start, int length) throws SAXException
... Code Here ...
if (bsalary)
String nodeValue=new String(ch, start, length);\
if(nodeValue.compareTo("100000")==0)
//Use employeeName Here...
bsalary = false;
... Code Here ...
【讨论】:
以上是关于使用 SAX 解析器时如何获取父节点?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 中使用 DOM 或 SAX 解析器从 XML 读取子节点
java解析xml文件,会把节点属性中的换行转换成空格,怎样才能避免此类转换,即保留换行