SAX analisi – efficace per ottenere i nodi di testo

Dato questo frammento di codice XML

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>

In SAX, è facile da ottenere i valori di attributo:

@Override
public void startElement (String uri, String localName,
              String qName, Attributes attributes) throws SAXException{
    if(qName.equals("book")){
        String bookId = attributes.getValue("id");
        ...
    }
}

Ma per ottenere il valore di un nodo di testo, ad esempio, il valore del <author> tag, è molto difficile…

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();
    }
}
  1. Non sono sicuro al di sopra del campione, anche di lavoro, cosa pensi di questo approccio?
  2. C’è un modo migliore? (per ottenere il testo del nodo di valore)
  • è il più efficiente penso…
InformationsquelleAutor Eran Medan | 2010-01-14

 

2 Replies
  1. 9

    Che è il solito modo di farlo con il SAX.

    Devi solo fare attenzione che characters() può essere chiamato più di una volta al tag. Vedere questo domanda per ulteriori informazioni. Ecco una esempio.

    Altrimenti si potrebbe dare una prova di StAX.

    • grande esempio – grazie!!!
  2. 1
    public void startElement(String strNamespaceURI, String strLocalName,
          String strQName, Attributes al) throws SAXException {
           if(strLocalName.equalsIgnoreCase("HIT"))
           {
                String output1 = al.getValue("NAME");
              //this will work but how can we parse if NAME="abc" only     ?
           }
    
       }

Lascia un commento