我有一个术语列表(字符串),它可能存在于给定的XML文档中,也可能不存在。我需要在属性值中查找此字符串,如果找到它,则返回其自己的标记及其父标记。我怎么能用Java做到这一点?
编辑: 我使用DOM Parser或SAX Parser遇到了多种方法,或者自己编写一个。我想知道最有效的方法。
答案 0 :(得分:0)
你可以使用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
答案 1 :(得分:0)
The Java API for XML Processing (JAXP)
用于XML处理的Java API(JAXP)使应用程序能够解析, 使用API转换,验证和查询XML文档 独立于特定的XML处理器实现。 JAXP 提供可插拔层,使供应商能够提供自己的 实现而不在应用程序代码中引入依赖项。
XPath表达式比详细文档更容易编写 对象模型(DOM)导航代码。当你需要提取 来自XML文档的信息,最快捷,最简单的方法 在Java程序中嵌入XPath表达式。 Java 5介绍 javax.xml.xpath包,一个独立于XML对象模型的库 用XPath查询文档。
答案 2 :(得分:0)
您可以在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来获取包含节点对象及其父节点。
答案 3 :(得分:0)
自己找到答案。 我用过这个
SAXParserFactory spfac = SAXParserFactory.newInstance();
SAXParser sp = spfac.newSAXParser();
EMSAXParser handler = new EMSAXParser(this.terms);
然后我实现了以下方法,同时使用堆栈推入每个开始并弹出每个结束标记。当文本为founf时,搜索完成,然后如果在文本中找到该术语,则会查看堆栈的上面两个元素。
startElement(String uri, String localName, String qName, Attributes attributes);
characters(char[] buffer, int start, int length);
endElemnet(String uri, String localName, String qName);
谢谢大家的帮助。