Given this XML snippet
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
In SAX, it is easy to get attribute values:
@Override
public void startElement (String uri, String localName,
String qName, Attributes attributes) throws SAXException{
if(qName.equals("book")){
String bookId = attributes.getValue("id");
...
}
}
But to get the value of a text node, e.g. the value of the <author> tag, it is quite hard…
private StringBuffer curCharValue = new StringBuffer(1024);
@Override
public void startElement (String uri, String localName,
String qName, Attributes attributes) throws SAXException {
if(qName.equals("author")){
curCharValue.clear();
}
}
@Override
public void characters (char ch[], int start, int length) throws SAXException
{
//already synchronized
curCharValue.append(char, start, length);
}
@Override
public void endElement (String uri, String localName, String qName)
throws SAXException
{
if(qName.equals("author")){
String author = curCharValue.toString();
}
}
- I’m not sure the above sample is even working, what do you think of this approach?
- Is there a better way? (to get the text node’s value)
That’s the usual way to do it with SAX.
Just beware that
characters()may be called more than once per tag. See this question for more info. Here is a complete example.Otherwise you could give a try to StAX.