0

次のプログラムは、xmlファイルを適切に解析し、その名前要素の値とrelのリンク属性の値を表示します。これらの2つの値をArrayList<UserDetail>に格納したい

UserDetailクラス:

public class UserDetail {

private String name;
private String mailid;

public String getMailid() {
    return mailid;
}

public void setMailid(String mailid) {
    this.mailid = mailid;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

SAX解析クラス:

import java.util.ArrayList;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;

public class ReadXMLFile {



public static void main(String argv[]) {


    try {

        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

        DefaultHandler handler = new DefaultHandler() {

            boolean name = false;
            boolean link = false;


            public void startElement(String uri, String localName, String qName,
                    Attributes attributes) throws SAXException {

                //System.out.println("Start Element :" + qName);

                if (qName.equalsIgnoreCase("fullName")) {
                    name = true;
                }
                if (qName.equalsIgnoreCase("link")) {
                    System.out.println("\t" + attributes.getValue("rel"));
                }
            }

            public void endElement(String uri, String localName,
                    String qName, Attributes attributes) throws SAXException {
                if (qName.equalsIgnoreCase("fullName")) {

                    name = false;
                }
                if (qName.equalsIgnoreCase("link")) {
                    link = false;
                }
            }

            public void characters(char ch[], int start, int length) throws SAXException {

                if (name) {
                    System.out.println("First Name : " + new String(ch, start, length));
                    name = false;
                }

            }
          };

        saxParser.parse("D://abc.xml", handler);

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

XMLドキュメント:

 <feed>
   <entry>
     <fullName>Manish Sahu</fullName>
     <link rel='abc'/>
     <link rel='self'/>
     <link rel='edit'/>
  </entry>
</feed>
4

1 に答える 1

1

ビルド中の現在の User オブジェクトへの参照を保持します。

要素「entry」の場合、startElement で新しい UserDetails をインスタンス化し、それを endElement のリストに格納します (必要に応じて、ここで検証を追加できます)。次に、偶発的な変更を避けるために、現在のユーザーを null に設定します (例: エントリの外側のリンク要素)。

要素 "link" の場合、"ref" 属性の値をユーザーの詳細に追加します (UserDetails には、スカラー セッターの代わりに addLink メソッドなどがあるはずです)。

要素 "fullName" については、文字データを StringBuilder に連結し (パーサーの実装によっては文字が複数回呼び出される可能性があるため)、endElement に "現在のユーザー" の名前を設定してから、SB をクリアします。

public static void main(String argv[]) {

//must be final since it is referenced from an anonymous class
final List<UserDetail> users = new ArrayList <UserDetail>(); 

try {

    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {

        String element;
        StringBuilder sb=new StringBuilder();
        UserDetails user=null;

        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
             this.element=qName;

             //create a new user
             if (element.equals("entry")) user = new UserDetails();

             //save attribute <link rel="...">
             if (element.equals("link")&&user!=null) 
                 user.addLink(attributes.getValue("rel"));
        }

        public void endElement(String uri, String localName,
                String qName, Attributes attributes) throws SAXException {
           if (element.equals("fullName")) {
                  //store the name given in character data
                  user.setName(sb.toString());
                  sb.setLength(0);
           } else if (element.equals("entry")) {                                    
              users.add(user); //store the current user
              user=null;                   
           }               
        }

        public void characters(char ch[], int start, int length) throws SAXException            {
            if (element.equals("fullName")) sb.append(ch, start, length);
        }
      };

    saxParser.parse("D://abc.xml", handler);

    //do something with the users
    for (UserDetails user;users) System.out.println(user.getName()+" "+user.getMailid());

} catch (Exception e) {
    e.printStackTrace();
   //catching Exception is not a good practice!
}

}

上記のコードはコンパイルしていませんが、XML を解析するときに使用するものと似ています。フラグを設定する代わりに qName を保存すると、より複雑なコンテンツ モデルを扱う場合に役立ちます。(場合によっては、スタックを維持するために使用し、要素名を startElement にプッシュし、endElement にポップします)。

于 2013-02-18T07:09:55.847 に答える