8

この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. もっと良い方法はありますか?(テキストノードの値を取得するため)
4

2 に答える 2

9

これは、SAX で行う通常の方法です。

characters()タグごとに複数回呼び出される可能性があることに注意してください。詳細については、この質問を参照してください。完全なを次に示します。

それ以外の場合は、 StAXを試すことができます。

于 2010-01-14T14:36:54.577 に答える
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     ?
       }

   }
于 2011-09-16T13:12:42.610 に答える