【问题标题】:Problem parsing XML document with Java SAX使用 Java SAX 解析 XML 文档时出现问题
【发布时间】:2010-08-27 04:32:38
【问题描述】:

我正在解析一个 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、predicted_rating 和 id 粘贴出来。我正在成功地做到这一点。但是,我注意到当 user_rating 不包含任何值时,predicted_rating 将自动取 的值,而不是它自己的值 4.8。但是,当 user_rating 确实具有值时,predicted_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 具有属性“值”这一事实有关?我将不胜感激任何帮助。谢谢!

【问题讨论】:

    标签: java xml parsing sax


    【解决方案1】:

    我建议你等待

    endElement(String uri, String localName, String qName)
    

    在将元素标记为通过之前:

    inSomething = false
    

    我可以想象当元素为空时,

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

    不会被调用,您的标志不会被清除,并且您将遇到两个 inSomething 标志设置为 true 的不一致状态。

    【讨论】:

    • 我应该在 endElement() 中将所有布尔值设置为 false 吗?我一直在 characters() 中执行所有操作,如上面的原始示例所示...我修复了一次导致我出现问题的问题,但我在其他类中有很多其他布尔值设置为 false在字符()...
    • 嗯,视情况而定。在您发布的情况下,您的布尔值实际上表明您已经解析了该元素。只有当您点击结束元素时,您才能确定这一点是合理的。但是,例如,如果您想设置一些布尔值来指示元素具有非空值,那么将其设置在 characteds() 处理程序中是有意义的。希望这会有所帮助:)
    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 2023-04-09
    相关资源
    最近更新 更多