0

これに似たオンラインの XML ファイルがあります。

<example>
    <date>2012-10-13</date>
    <bob>What I already know how to get</bob>
</example>
<example>
    <date>2012-10-14</date>
    <bob>What I want as well as the above</bob>
</example>

「取得方法が既にわかっているもの」タグでデータを取得するために使用しているものは次のとおりです。

/**
 * Gets be called on opening tags like: <tag> Can provide attribute(s), when
 * xml was like: <tag attribute="attributeValue">
 */
@Override
public void startElement(String namespaceURI, String localName,
        String qName, Attributes atts) throws SAXException {
    if (localName.equals("example")) {
        this.in_example = true;
    } else if (localName.equals("bob")) {
        this.in_bob = true;
    }
}

/**
 * Gets be called on closing tags like: </tag>
 */
@Override
public void endElement(String namespaceURI, String localName, String qName)
        throws SAXException {
    if (localName.equals("example")) {
        this.in_example = false;
    } else if (localName.equals("bob")) {
        this.in_bob = false;
    }
}

/**
 * Gets be called on the following structure: <tag>characters</tag>
 */
@Override
public void characters(char ch[], int start, int length) {
    if (this.in_bob) {
                    // A custom DataParser
        myDataParser.setExtractedString(new String(ch, start, length));
    }
}

わかりました、ここで質問があります... 「私がすでに取得する方法を知っているもの」と同様のタグで囲まれているにもかかわらず、「上記と同様に欲しいもの」を取得するにはどうすればよいですか?

前もって感謝します :)

注: XML ドキュメントは予報のようなものなので、日付と他のタグの内容は常に変化します。

4

3 に答える 3

1

ファイル<example>の最上位に 2 つの要素が含まれている場合、そのファイルは整形式の XML ドキュメントではないため、XML パーサーは、解析しようとすると常に失敗します。

ただし、これは整形式の XML 外部エンティティであるため、エンティティ参照を使用して整形式の XML ドキュメントに含めることで解析できます。

于 2012-10-14T07:59:50.667 に答える
0

Michael Kayが指摘したように、示されているドキュメントは有効なXMLではありません。

最初の値を解析して取得できたように見えるので、実際にはそれはより大きなドキュメントの一部にすぎないと思います。

より多くの要素からデータを収集する場合は、文字列だけでなくリストのような構造に収集し、そのリストに新しいエントリを作成するタイミングを適切に制御する必要があります。

しかし、このcharacters方法は、あなたが考えているようにパーサーでは機能しません。単一のタグ内のコンテンツに対して、パーサーによって複数回呼び出すことができます。一度にすべてを取得することを期待するのではなく、データをバッファーに収集し、endElementが呼び出されたときにのみ完了することを期待する必要があります。

「bob」データのみを文字列のリストに収集するには、次のようにします。

public class ExampleHandler extends DefaultHandler {

    private List<String> results = new ArrayList<String>();
    private StringBuilder builder = new StringBuilder();

    @Override
    public void startElement(String namespaceURI, String localName,
                             String qName, Attributes atts) throws SAXException {
        if (localName.equals("bob")) {
            builder.setLength(0);
        }
    }

    @Override
    public void endElement(String namespaceURI, String localName, String qName)
            throws SAXException {
        if (localName.equals("bob")) {
            results.add(builder.toString());
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) {
        builder.append(ch, start, length);
    }

    public List<String> getResults() {
        return results;
    }
}

他のデータも収集したい場合は、もちろんもっと複雑になり、文字列のリスト以外のものに収集しますが、これで基本的な考え方がわかります。

于 2012-10-14T22:14:59.753 に答える
0

Listのに回答を追加できますStrings

最後の関数を次のように変更します。

List<String> results = new ArrayList<String>();

/**
 * Gets be called on the following structure: <tag>characters</tag>
 */
@Override
public void characters(char ch[], int start, int length) {
    if (this.in_bob) {
                    // A custom DataParser
        results.add(new String(ch, start, length));
    }
}

xml の説明が終わったら、収集された .xml を解析するだけStringsです。

于 2012-10-14T00:47:52.407 に答える