2

を使用してニュースサイトからいくつかの値を取得したいと思いますSAXParser。しかし、その構造は私には難しいです。私はXMLとSAXを初めて使用します。

問題:サイト名に同じタグ名を使用し、XMLにニュースタイトルを使用しているニュースサイト。

Javaコードを実行するとエラーなしで動作しますが、問題は出力に関するものです。

タグの子タグのみを取得するにはどうすればよいですか?アプリケーションにサイトタイトルを表示したくありません。それは私にとって大きな問題です。<item><title>

XML側

<channel>

   <title>Site Name</title>

   <item>  
       <title>News Title!</title>       
   </item>

</channel>

Java側

Javaファイルにエラーはありません:)

try {

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

            DefaultHandler handler = new DefaultHandler() {

                boolean newsTitle   = false;


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

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

                    if (qName.equalsIgnoreCase("title")) {
                        newsTitle = true;
                    }

                }

                public void endElement(String uri, String localName,
                        String qName) throws SAXException {

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

                }

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

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

                }

            };

            saxParser
                    .parse("C:\\ntv.xml",handler);

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

出力:

Title : Site Name

Title : News Title
4

2 に答える 2

1

DefaultHandlerにスタックを追加できます。でタグを見つけたら、そのタグをスタックにstartElementプッシュしてからendElement、一番上のタグをスタックからポップします。ドキュメント内のどこにいるかを知りたい場合は、スタックに/ title / item/titleが含まれているか/titleだけが含まれているかを確認してください。

名前空間を気にしない場合は、qNameの代わりにlocalNameを使用してください。qNameには、名前空間が付加されている場合があります。

また、文字メソッドの使用方法が正しくありません(これは一般的な問題です)。SAXチュートリアルの説明を参照してください。

于 2013-03-15T22:02:09.743 に答える
1

SAXを使用してXMLを解析するのではなく、XPathを使用できます。

ケースのXPath式は次のとおりです。

/channel/item/title

コード例:

import org.xml.sax.InputSource;

import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.StringReader;

public class XPathTest {

    public static void main(String[] args) throws XPathExpressionException {

        String xml = "<channel>\n" +
                "\n" +
                "   <title>Site Name</title>\n" +
                "\n" +
                "   <item>  \n" +
                "       <title>News Title!</title>       \n" +
                "   </item>\n" +
                "\n" +
                "</channel>";

        Object result = XPathFactory.newInstance().newXPath().compile("/channel/item/title").evaluate(new InputSource(new StringReader(xml)));
        System.out.print(result);
    }
}
于 2013-03-17T13:32:26.350 に答える