【发布时间】:2021-03-30 22:58:05
【问题描述】:
我想从一个包含 xml 元素的 api 中获取节点。
https://www.w3schools.com/xml/cd_catalog.xml这里是api的链接。
所以我的Java代码是这样的:
package in.automationtesting.neh;
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.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import com.fasterxml.jackson.databind.ObjectMapper;
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());
XPathFactory xpathfactory = XPathFactory.newInstance();
XPath xpath = xpathfactory.newXPath();
try {
Reader reader = new StringReader(response.body());
InputSource inputSource = new InputSource(reader);
XPath xpath1 = XPathFactory.newInstance().newXPath();
System.out.println(xpath1.evaluate("//CATALOG/CD", inputSource));
} 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,而且它们应该只来自美国。当我只匹配 xpath 表达式中的根目录时,它显示了所有好的元素,但是当我在它旁边添加 cd 时,在控制台上它只显示一张专辑而不是全部,我知道为什么我尝试在表达和其他变体中类似这样,但没有运气 "//CATALOG/CD[@year>1995 and country='USA']
【问题讨论】: