2011-10-12 222 views
0

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

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”变量那里所有的东西去正确的,我也没问题。你知道这是什么吗?

+0

这里的一个更大的问题是字符方法。 –

回答

2

我的猜测是,你的XML使用命名空间,但你的SAXParser没有配置命名空间处理(在这种情况下,限定元素,“前缀:的localName ',出现在qName参数中)。如果您使用JAXP,请将上的namespaceAware属性设置为true。为了确保你的处理正确的元素,你还应该检查uri参数是你期望的(或者应该期望的)。

您还有一个characters方法的问题。即使元素仅包含文本,caharacters()方法也可以针对每个元素多次调用。你需要做的是使用StringBuidler来收集字符,并在enedELement方法中使用它。

4

XML命名空间包含2部分结构,一部分称为URI,第二部分称为localName。例如。将

html:va xmlns:html="www.google.com" 

这里,URIwww.google.comlocalNameVA。这些在XML的开始标签中指定。在你的情况下,你的XML的命名空间看起来有些不妥。这可能是你得到这个问题的原因。

更多信息可以在这里找到:

http://www.saxproject.org/namespaces.html