java - Java 中的 XPath 表达式,用于获取带有标签的 xml 元素
问题描述
我想从包含 xml 元素的 api 中获取节点。
https://www.w3schools.com/xml/cd_catalog.xml这是 api 的链接。
所以我的Java代码是这样的:
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class Test1 {
public static final String GET_API_URL = "https://www.w3schools.com/xml/cd_catalog.xml";
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().GET().header("accept", "application/xml").uri(URI.create(GET_API_URL)).build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
try {
Reader reader = new StringReader(response.body());
InputSource inputSource = new InputSource(reader);
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("/CATALOG/CD[COUNTRY='USA' and YEAR>=1995]");
NodeList list = (NodeList)expr.evaluate(inputSource, XPathConstants.NODESET);
for (int i = 0; i < list.getLength(); i++) {
Node node = list.item(i);
System.out.println(node.getTextContent());
}
}
catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}
控制台上的输出应该是这样的:
<CATALOG>
<CD>
<TITLE>1999 Grammy Nominees</TITLE>
<ARTIST>Many</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Grammy</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1999</YEAR>
</CD>
<CD>
<TITLE>Big Willie style</TITLE>
<ARTIST>Will Smith</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1997</YEAR>
</CD>
</CATALOG>
使用 xpath 表达式,我只能得到 1995 年及以后发布的 cd 值,但没有 xml 标签。
我的控制台输出是这样的:
1999 Grammy Nominees
Many
USA
Grammy
10.20
1999
Big Willie style
Will Smith
USA
Columbia
9.90
1997
那么关于如何获得完全相同的输出但使用 xml 标签的任何解决方案?如果有人回答,您能否向我解释您的步骤或方法在代码中是如何工作的,抱歉,这里是初学者,我有很多内容要介绍:-) 提前致谢。
解决方案
Transformer类可以帮助我们实现你想要的
这是一种转换Node
为的方法String
private static String nodeToString(Node node) throws TransformerException {
StringWriter res = new StringWriter();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(node), new StreamResult(res));
return res.toString();
}
你可以这样称呼它
System.out.println(nodeToString(node));
推荐阅读
- linux - Python:在使用 python tesseract API 接口时遇到 OCR 问题
- javascript - 如何解决问题:使用 i18next 库本地化数组中的值时,我得到未定义?
- c# - Unity 甚至无法识别我的函数“OnTriggerEnter()”上的“Collider”
- python - 解析 .TSV 文件并通过重新排列列将数据写入新的 .TSV 文件
- java - spring batch Classifier:Writer必须打开才能写入
- bash - eval 如何停止此脚本中的 pathspec 错误?
- javascript - 将图像存储到数组中并将它们显示到角度视图中
- polymer-3.x - 通过将键保留在聚合物 3 中,仅在单击功能时清除对象中的值
- openstack - 如何更改软件包的安装后脚本并重新安装?
- python-3.x - 我在 GAE 上运行 python dash web 应用程序。它在本地运行良好,但我在资产文件夹中的本地图像在部署后不会出现?