我编写了将解析XML文件的应用程序。我使用SAX解析器,这是我的SAX处理程序代码:

public class XMLHandler extends DefaultHandler {

private static final String MEASURES = "measures";

private static final String SUGARMEASUREDATE = "sugarMeasureDate";
private static final String SUGARMEASUREVALUE = "sugarMeasureValue";

private static final String UPGYROSCOPEDATE = "upGyroscopeDate";
private static final String UPGYROSCOPEVALUE = "upGyroscopeValue";

private static final String DOWNGYROSCOPEDATE = "downGyroscopeDate";
private static final String DOWNGYROSCOPEVALUE = "downGyroscopeValue";

Boolean currentElement = false;
String currentValue = null;

public static MeasureLists measureLists = null;

public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    currentElement = true;

    if (localName.equals("measures")) {
        measureLists = new MeasureLists();
    }
}

public void endElement(String uri, String localName, String qName) throws SAXException {

    currentElement = false;
    if (localName.equals(SUGARMEASUREDATE)) {
        measureLists.setSugarDate(currentValue);
    }
    else if (localName.equals(SUGARMEASUREVALUE)) {
        measureLists.setSugarValue(currentValue);
    }
    else if (localName.equals(UPGYROSCOPEDATE)) {
        measureLists.setUpGyroscopeDate(currentValue);
    }
    else if (localName.equals(UPGYROSCOPEVALUE)) {
        measureLists.setUpGyroscopeValue(currentValue);
    }
    else if (localName.equals(DOWNGYROSCOPEDATE)) {
        measureLists.setDownGyroscopeDate(currentValue);
    }
    else if (localName.equals(DOWNGYROSCOPEVALUE)) {
        measureLists.setDownGyroscopeValue(currentValue);
    }
}

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

    if (currentElement) {
        currentValue = new String(ch, start, length);
        currentElement = false;
    }
}

public MeasureLists getMeasureLists() {
    return measureLists;
}
}


我的问题是此代码可以正确检测事件(开始和结束标记),但变量localName为空的String。我在文档中读到,如果“未执行命名空间处理”,localName为空。我的问题是这是什么意思,我该如何处理。感谢您的帮助和提示。

编辑

我注意到当我将“ qName”的“ localName”变量更改时,一切正常,我没有问题。你知道这是什么吗?

最佳答案

我的猜测是您的XML使用名称空间,但未将SAXParser配置为用于名称空间处理(在这种情况下,qName参数中存在限定元素'prefix:localName')。如果使用JAXP,请将namespaceAware上的SAXParserFactory属性设置为true。要真正确保您正在处理正确的元素,还应该检查uri参数是否符合您的期望(或应该期望)。

您也有characters方法的问题。对于每个元素,即使元素仅包含文本,也可能多次调用caharacters()方法。您需要做的是使用StringBuidler收集字符,然后在enedELement方法中使用字符。

08-05 06:07