4

タイトルにあるように、私は現在、XML 形式の文字列を解析する必要性に対処していますが、元の文字列内の要素タグの開始と要素タグの終了の文字インデックスに関する情報を格納できます。私は SAX と DOM を見てきましたが、そのデータを提供してくれるものは何も見つからないようです。助言がありますか?

ありがとう。

4

2 に答える 2

0

LocatorDefaultHandlerおよびを参照してくださいSAXParser。行番号と列番号を与える例として:

public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException {
    String xml = 
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
            "<project \n"+ 
            ">\n"+
            "    <description>A description</description>\n"+
            "</project>\n";
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();
    InputSource inps = new InputSource(new StringReader(xml));
    DefaultHandler df = new XDefaultHandler();
    sp.parse(inps, df);
}

static class XDefaultHandler extends DefaultHandler {
    Locator l = null;

    @Override
    public void setDocumentLocator(Locator locator) {
        l = locator;
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("element: " + qName);
        System.out.println("locator: " + l.getLineNumber() + "/" + l.getColumnNumber());
    }
}

出力は次のとおりです。

element: project
locator: 3/2
element: description
locator: 4/18

XDefaultHandler の他のメソッドをオーバーライドして、要素の終了などの呼び出しを受け取ります。

編集:(ボタンを押すのが早すぎます)

のドキュメントからLocator.getLineNumber():

現在のドキュメント イベントが終了する行番号を返します。行は、XML 仕様で定義されている行末で区切られます。

警告: メソッドからの戻り値は、診断のための近似値としてのみ意図されています。元の XML ドキュメントの文字コンテンツを編集するための十分な情報を提供することを意図したものではありません。これらの「行」番号は、列として表示されるものと一致する場合もあれば、内部エンティティ展開のためにソース テキストと一致しない場合もあります。

戻り値は、イベントをトリガーするマークアップが表示されるドキュメント エンティティまたは外部の解析済みエンティティの行番号の近似値です。

于 2012-07-02T20:13:20.470 に答える
0

役に立つかどうかはわかりませんが、SAX がシーケンシャルであることを考えると、文字のカウンターを保持できませんか? 唯一の問題は、一部の空白が無視される可能性があることです。

于 2012-07-02T18:46:28.960 に答える