SAX-разбор - эффективный способ получить текстовые узлы - PullRequest
8 голосов
/ 14 января 2010

Учитывая этот фрагмент XML

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

В SAX легко получить значения атрибутов:

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

Но чтобы получить значение текстового узла, например значение тега <author>, это довольно сложно ...

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. Я не уверен, что приведенный выше пример даже работает, что вы думаете об этом подходе?
  2. Есть ли лучший способ? (чтобы получить значение текстового узла)

Ответы [ 2 ]

9 голосов
/ 14 января 2010

Это обычный способ сделать это с SAX.

Просто помните, что characters() может вызываться более одного раза для каждого тега. См. Этот вопрос для получения дополнительной информации. Вот полный пример .

В противном случае вы можете попробовать StAX .

1 голос
/ 16 сентября 2011
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     ?
       }

   }
...