MyObjectA
No
4
Honda
No
我的XML采用这种格式.我正在使用SAX解析器来解析此文件,因为xml文件的大小可能很大.
我应该遵循什么模式来解析文件.
通常我一直在遵循这种方法:
//PseudoCode
if(start){
if(type Office)
{
create an instance of type Office and populate the attributes of Office in the Office class using a call back
}
if(type Vehicle)
{
create an instance of type Vehicle and populate the attributes of Vehicle in the Vehicle class using a call back
}
}
if(end){
// do cleaning up
}
这种方法通常使我的解析函数包含起始和结束标记.
还有其他更好的方法可以遵循.
解决方法:
我对这种方法有很好的经验:
>创建查找表以将节点名称映射到处理程序函数.您很可能需要为每个节点名称维护两个处理程序,一个用于开头,一个用于结束标记.
>维护一组父节点.
>从查找表中调用处理程序.
>每个处理函数都可以执行其任务而无需进一步检查.但是如果需要,每个处理程序也可以通过查看父节点堆栈来确定当前上下文.如果节点层次结构中的不同位置具有相同名称的节点,则这一点很重要.
一些伪Java代码:
public class MyHandler extends DefaultHandler {
private Map startLookup = new HashMap();
private Map endLookup = new HashMap();
private Stack nodeStack = new Stack();
public MyHandler() {
// Initialize the lookup tables
startLookup.put("Office", new MyCallbackAdapter() {
public void execute() { myOfficeStart() }
});
endLookup.put("Office", new MyCallbackAdapter() {
public void execute() { myOfficeEnd() }
});
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) {
nodeStack.push(localName);
MyCallbackAdapter callback = (localName);
if (callback != null)
}
public void endElement(String namespaceURI, String localName, String qName)
MyCallbackAdapter callback = (localName);
if (callback != null)
nodeStack.pop();
}
private void myOfficeStart() {
// Do the stuff necessary for the "Office" start tag
}
private void myOfficeEnd() {
// Do the stuff necessary for the "Office" end tag
}
//...
}
一般建议:
根据您的要求,您可能需要更多上下文信息,例如上一个节点名称或当前节点为空.如果您发现自己添加了越来越多的上下文信息,您可能会考虑切换到完整的fletched DOM解析器,除非运行时速度比开发速度更重要.
标签:java,oop,design-patterns
来源: .html
本文发布于:2024-01-28 10:05:05,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064075116649.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |