【问题标题】:Find self and parent tag in XML document在 XML 文档中查找自身和父标记
【发布时间】:2012-06-28 14:40:05
【问题描述】:

我有一个术语列表(字符串),它可能出现在给定的 XML 文档中,也可能不出现。我需要在属性值中查找这个字符串,如果找到,返回它自己的标签和它的父标签。我如何在 Java 中做到这一点?

编辑: 我遇到了多种使用 DOM Parser 或 SAX Parser 或自己编写的方法。我想知道最有效的方法。

【问题讨论】:

  • 你试过什么?您是否搜索过解决如何解析 xml 文档的数百万个问题? xml 是什么样的?您要查找的术语是什么?这个问题质量很差,你应该编辑它。

标签: java xml dom xml-parsing


【解决方案1】:

您可以使用 XPath;例如,//*[@* = 'something'] 将匹配所有例如<a b="something"/>、<a b="c" d="something"><e f="g"/></a>等

关于在 Java 中使用 XPath,请查看以下页面:http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/xpath/package-summary.html

【讨论】:

    【解决方案2】:

    The Java API for XML Processing (JAXP)

    用于 XML 处理的 Java API (JAXP) 使应用程序能够解析、 使用 API 转换、验证和查询 XML 文档 独立于特定的 XML 处理器实现。 JAXP 提供可插拔层,使供应商能够提供自己的 在应用程序代码中不引入依赖项的实现。

    The Java XPath API

    XPath 表达式比详细的 Document 更容易编写 对象模型 (DOM) 导航代码。当你需要提取 来自 XML 文档的信息,最快和最简单的方法是 在 Java 程序中嵌入 XPath 表达式。 Java 5 介绍 javax.xml.xpath 包,一个独立于 XML 对象模型的库 用于使用 XPath 查询文档。

    【讨论】:

      【解决方案3】:

      您可以在 Xml 文档上运行 XPath 表达式:

      InputSource source= new InputSource(new FileInputStream(doc)));
      XPathFactory factory = XPathFactory.newInstance();
      XPath xpath = factory.newXPath();
      NodeList nodes = (NodeList)xpath.evaluate("//@*[. = \'" + myString + "\']", source, XPathConstants.NODESET);
      

      然后您可以使用生成的 NodeList 来获取包含节点对象及其父节点。

      【讨论】:

        【解决方案4】:

        自己找到了答案。 我用过这个

        SAXParserFactory spfac = SAXParserFactory.newInstance();
        SAXParser sp = spfac.newSAXParser();
        EMSAXParser handler = new EMSAXParser(this.terms);
        

        然后我实现了以下方法,同时使用堆栈为每个开始标签压入并为每个结束标签弹出。当找到文本时,会进行搜索,然后如果在文本中找到该术语,则查看堆栈的上两个元素。

        startElement(String uri, String localName, String qName, Attributes attributes);
        characters(char[] buffer, int start, int length);
        endElemnet(String uri, String localName, String qName);
        

        感谢大家的帮助。

        【讨论】:

          猜你喜欢
          • 2014-04-22
          • 2017-02-13
          • 2015-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-19
          • 1970-01-01
          • 2021-05-23
          相关资源
          最近更新 更多