首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在XML标记之间跳转

在XML标记之间跳转
EN

Stack Overflow用户
提问于 2009-09-18 09:00:51
回答 5查看 635关注 0票数 0

这在SAX中是一个疑问。我希望处理XML文件中的子标记,但前提是它与父标记匹配。对于ex:

代码语言:javascript
复制
<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方面都是新手?如果是这样的话,你能引述相应的方法吗?提亚

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-18 09:10:54

当然,这可以通过记住父标签来轻松完成。

通常,在解析xml标记时,人们使用堆栈来跟踪这些标记的家族映射。您的案例可以通过以下代码轻松解决:

代码语言:javascript
复制
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();
     }
}

或者,您可以通过更新标记名来简单地记住您所在的标记:

代码语言:javascript
复制
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;
}

但是我更喜欢堆栈的方式,因为它会跟踪你所有的祖先标签。

票数 1
EN

Stack Overflow用户

发布于 2009-09-18 10:49:35

如果您出于性能原因考虑这样做,那么SAX无论如何都会遍历整个文档。

但是,从代码美观的角度来看,您可以通过将SAX解析器与XMLFilter连接起来,使其不返回不匹配的子级。您可能仍然需要自己编写逻辑--就像Wing C. Chen's post中提供的那样--但是您可以将其抽象到一个过滤器实现中,而不是将其放在您的应用程序逻辑上。

这将使您可以更容易地重用过滤逻辑,并且可能会使您的应用程序代码更清晰、更易于遵循。

票数 1
EN

Stack Overflow用户

发布于 2009-09-18 12:18:48

@Wing C. Chen提出的解决方案非常不错,但在您的情况下,我不会使用堆栈。

解析XML时堆栈的用例

堆栈和XML的一个常见用例是,例如,当使用您自己的词法分析器(即具有容错功能的手工XML解析器)时,验证XML标记是否平衡。

它的一个具体示例是为Eclipse IDE构建XML文档的大纲。

何时使用SAX、拉式解析器和类似的

  • 内存效率当解析一个巨大的XML文件
  • 时,您不需要在文档中来回导航。

但是,使用SAX解析复杂的文档可能会变得单调乏味,特别是当您希望根据某些条件对节点应用操作时。

何时像APis一样使用DOM

  • 您想要方便地访问要随时在文档中来回导航的节点
  • 速度不是对开发环境的主要要求

我的推荐

如果您没有大量的可扩展标记语言,可以使用DOM之类的API,并使用XPath选择节点。就我个人而言,我更喜欢Dom4J,但我不介意其他APis,如JDom,甚至是支持XPath的Xpp3。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1443347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档