我想在 Java 中使用 XPath 读取 XML 数据,因此对于我收集的信息,我无法根据我的要求解析 XML。
这是我想做的:
通过 URL 从网上获取 XML 文件,然后使用 XPath 解析它,我想在其中创建两个方法。 一个是我输入一个特定的节点属性id,然后我得到所有子节点作为结果,第二个是假设我只想获取一个特定的子节点值
<?xml version="1.0"?> <howto> <topic name="Java"> <url>http://www.rgagnonjavahowto.htm</url> <car>taxi</car> </topic> <topic name="PowerBuilder"> <url>http://www.rgagnon/pbhowto.htm</url> <url>http://www.rgagnon/pbhowtonew.htm</url> </topic> <topic name="Javascript"> <url>http://www.rgagnon/jshowto.htm</url> </topic> <topic name="VBScript"> <url>http://www.rgagnon/vbshowto.htm</url> </topic> </howto>
在上面的示例中,如果我通过 @name 搜索,我想读取所有元素,并且我希望 @name ‘Javascript’ 中的 url 只返回一个节点元素的一个函数。
你需要一些类似的东西:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(<uri_as_string>); XPathFactory xPathfactory = XPathFactory.newInstance(); XPath xpath = xPathfactory.newXPath(); XPathExpression expr = xpath.compile(<xpath_expression>);
然后,您调用expr.evaluate()传入该代码中定义的文档和您期望的返回类型,并将结果转换为结果的对象类型。
expr.evaluate()
如果您需要有关特定 XPath 表达式的帮助,您可能应该将其作为单独的问题提出(除非这是您首先提出的问题——我理解您的问题是如何在 Java 中使用 API)。
编辑:(对评论的回应):这个 XPath 表达式将为您提供 PowerBuilder 下第一个 URL 元素的文本:
/howto/topic[@name='PowerBuilder']/url/text()
这将为您提供第二个:
/howto/topic[@name='PowerBuilder']/url[2]/text()
您可以通过以下代码获得:
expr.evaluate(doc, XPathConstants.STRING);
如果您不知道给定节点中有多少个 URL,那么您应该这样做:
XPathExpression expr = xpath.compile("/howto/topic[@name='PowerBuilder']/url"); NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
然后循环遍历 NodeList。