这在SAX中是一个疑问。我希望处理XML文件中的子标记,但前提是它与父标记匹配。对于ex:
<version>
<parent tag-1>
<tag 1>
<tag 2>
</parent tag-1 >
<parent tag-2>
<tag 1>
<tag 2>
</parent tag-2>
</version>在上面的代码中,我希望首先匹配父标记(即,根据用户输入,即父标记-1或父标记-2),然后再处理它下面的子标记。这可以在SAX解析器中完成吗?请记住,SAX对DOM的控制有限,而且我在SAX和Java方面都是新手?如果是这样的话,你能引述相应的方法吗?提亚
发布于 2009-09-18 09:10:54
当然,这可以通过记住父标签来轻松完成。
通常,在解析xml标记时,人们使用堆栈来跟踪这些标记的家族映射。您的案例可以通过以下代码轻松解决:
Stack<Tag> tagStack = new Stack<Tag>();
public void startElement(String uri, String localName, String qName,
Attributes attributes)
if(localName.toLowerCase().equals("parent")){
tagStack.push(new ParentTag());
}else if(localName.toLowerCase().equals("tag")){
if(tagStack.peek() instanceof ParentTag){
//do your things here only when the parent tag is "parent"
}
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException{
if(localName.toLowerCase().equals("parent")){
tagStack.pop();
}
}或者,您可以通过更新标记名来简单地记住您所在的标记:
String tagName = null;
public void startElement(String uri, String localName, String qName,
Attributes attributes)
if(localName.toLowerCase().equals("parent")){
tagName = "parent";
}else if(localName.toLowerCase().equals("tag")){
if(tagName!= null && tagName.equals("parent")){
//do your things here only when the parent tag is "parent"
}
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException{
tagName = null;
}但是我更喜欢堆栈的方式,因为它会跟踪你所有的祖先标签。
发布于 2009-09-18 10:49:35
如果您出于性能原因考虑这样做,那么SAX无论如何都会遍历整个文档。
但是,从代码美观的角度来看,您可以通过将SAX解析器与XMLFilter连接起来,使其不返回不匹配的子级。您可能仍然需要自己编写逻辑--就像Wing C. Chen's post中提供的那样--但是您可以将其抽象到一个过滤器实现中,而不是将其放在您的应用程序逻辑上。
这将使您可以更容易地重用过滤逻辑,并且可能会使您的应用程序代码更清晰、更易于遵循。
发布于 2009-09-18 12:18:48
@Wing C. Chen提出的解决方案非常不错,但在您的情况下,我不会使用堆栈。
解析XML时堆栈的用例
堆栈和XML的一个常见用例是,例如,当使用您自己的词法分析器(即具有容错功能的手工XML解析器)时,验证XML标记是否平衡。
它的一个具体示例是为Eclipse IDE构建XML文档的大纲。
何时使用SAX、拉式解析器和类似的
但是,使用SAX解析复杂的文档可能会变得单调乏味,特别是当您希望根据某些条件对节点应用操作时。
何时像APis一样使用DOM
我的推荐
如果您没有大量的可扩展标记语言,可以使用DOM之类的API,并使用XPath选择节点。就我个人而言,我更喜欢Dom4J,但我不介意其他APis,如JDom,甚至是支持XPath的Xpp3。
https://stackoverflow.com/questions/1443347
复制相似问题