Проблема синтаксического анализа XML-документа с помощью Java SAX - PullRequest
0 голосов
/ 27 августа 2010

Я анализирую документ XML. Я делал это тысячи раз, но не понимаю, почему у меня возникает следующая проблема:

Вот соответствующая часть XML-документа, который я анализирую:

XML: <?xml version="1.0" standalone="yes"?>
<ratings>
<url_template>http://api.netflix.com/users/T1BlCJtdcWMuF6gJEfue96_W.kZ_gW81h59KqLEfT1AzE-/ratings/title?{-join|&amp;|title_refs}</url_template>
<ratings_item>
    <user_rating value="not_interested"></user_rating>
    <predicted_rating>4.8</predicted_rating>
    <id>http://api.netflix.com/users/T1BlCJtdcWMuF6gJEfue96_W.kZ_gW81h59KqLEfT1AzE-/ratings/title/70112530</id>
    <link href="http://api.netflix.com/catalog/titles/series/70112530/seasons/70112530" rel="http://schemas.netflix.com/catalog/title" title="Castle: Season 1">
    </link>
    .
    .
    .

Итак, я пытаюсь сократить пользовательский рейтинг, прогнозируемый рейтинг и идентификатор. Я делаю это успешно. Тем не менее, я замечаю, что когда user_rating не содержит значения, то предикат прогнозирования автоматически принимает значение, а не его собственное значение 4,8. Однако, когда user_rating имеет значение, тогда прогнозируемое_рейтинг будет иметь правильное значение. Вот мой код синтаксического анализа:

public class RatingsHandler extends DefaultHandler {

Vector vector;
Ratings ratings;

boolean inUserRating;
boolean inPredictedRating;
boolean inAverageRating;
boolean inID;

public void startDocument() throws SAXException {
    vector = new Vector();
    ratings = new Ratings();
}

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

    if (localName.equals("user_rating")) {
        inUserRating = true;

    } else if (localName.equals("predicted_rating")) {
        inPredictedRating = true;

    } else if (localName.equals("average_rating")) {
        inAverageRating = true;

    } else if (localName.equals("id")) {
        inID = true;

    }

}

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

    if (inUserRating) {
        ratings.setUserRating(new String(ch, start, length));
        inUserRating = false;
    } else if (inPredictedRating) {
        ratings.setPredRating(new String(ch, start, length));
        inPredictedRating = false;
    } else if (inAverageRating) {
        ratings.setAvgRating(new String(ch, start, length));
        inAverageRating = false;
    } else if (inID) {
        Const.rating_id = new String(ch, start, length);
        inID = false;
    }
}

public void endDocument() throws SAXException {

    if (ratings != null) {
        vector.addElement(ratings);
    }
}

public Vector getRatings() {
    return vector;
}

 }

Это как-то связано с тем, что user_rating имеет атрибут «значение»? Буду признателен за любую помощь. Спасибо!

1 Ответ

3 голосов
/ 27 августа 2010

Я бы посоветовал вам подождать

endElement(String uri, String localName, String qName)

, прежде чем пометить элемент как пройденный:

inSomething = false

Я могу представить, что когда элемент пуст,

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

не будет вызван, ваш флаг не будет сброшен, и вы попадете в состояние нерешительности с двумя флагами inSomething, установленными в true.

...