1

.xmlJava プロジェクトのパッケージ内に、次の形式のデータを含むファイルがあります...

<?xml version="1.0"?>
<postcodes>
    <entry postcode='AB1 0AA' latitude='7.101478' longitude='2.242852' />
</postcodes>

startElement()私は現在、カスタムDefaultHandlerで次のようにオーバーライドしています。

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    if (attributes.getValue("postcode") == "AB43 8TZ"){
        System.out.println("The postcode 'AB43 8TZ', has a latitude of "+attributes.getValue("latitude")+" and a longitude of "+attributes.getValue("longitude"));
    }
}

コードがこのメソッドの外で機能していることはわかっています。以前に、各要素のすべての属性を出力して問題なく機能することをテストしたからです。しかし今は、あたかもその郵便番号の値が見つからなかったかのように、何もしません。(XML ソースからのコピペ作業なので、そこにあることはわかっています)

追加の詳細; もともと重要な詳細を省略していたことをお詫びします。これらのファイルの中には、最大 50,000 行あるものもあるため、それらをメモリに格納することは、可能な限り不可能です。そのため、私はSAXを使用しています。補足として、絶対ディレクトリからではなく、同じプロジェクト内からファイルを参照する方法も見つからないため、「プロジェクト内のこれらのファイルから」という言葉を使用します。

4

4 に答える 4

2

(OPから要求されたコメントから。)

==まず、文字列を演算子と比較することはできません。equals()代わりに使用してください。Java で文字列を比較するにはどうすればよいですか?という質問を参照してください。詳細については。

equals()第 2 に、すべての要素が郵便番号属性を持っているわけではないため、nullオブジェクトを呼び出してNullPointerException. それを逆にしてください、例えば

"AB43 8TZ".equals(attributes.getValue("postcode"))
于 2013-09-20T14:52:24.717 に答える
1

XML パーサーを使用します。幸いなことに、JDK はこれらをすぐに使える JAXPの形式で提供します。現在、XML の解析には主要な「フレーバー」がほとんどないため、いくつかの方法があります。このタスクでは、DOM パーサーが最も使いやすいと思います。あなたはそのようにすることができます:

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(new File("name/of/the/file.xml"));
Element root = document.getDocumentElement();

次に、DOM トラバーサル API を使用します。

編集:元の質問から、処理したいデータが大きいことは明らかではありませんでした。その場合、DOM パーサーは確かに適切なソリューションではありません。これは、正確にメモリ消費が原因です。大規模な XML ドキュメントを解析する目的で、SAX および StAX パーサーが発明されました。ストリーミングの性質上、少し使いにくいと感じるかもしれませんが、それが効率の源でもあります。リンクされた Oracle JAXP チュートリアルには、SAXStAXに関するセクションもあります。

于 2013-08-30T14:42:44.920 に答える
0

JDK/JRE に含まれる APIを使用し、javax.xml.xpathXPath を使用して、XML ドキュメントから取得するデータを指定できます。

于 2013-08-30T16:23:52.680 に答える