首页 > 解决方案 > 如何查找 XML API 响应中的节点数?

问题描述

我在测试

这是 API 端点:http://ergast.com/api/f1

查找特定季节返回的数字 (numberOfCircuits) 的最佳方法是什么?

特定季节的响应是:

<MRData xmlns="http://ergast.com/mrd/1.4" series="f1" url="http://ergast.com/api/f1/1950" limit="30" offset="0" total="7">
    <RaceTable season="1950">
        <Race season="1950" round="1" url="http://en.wikipedia.org/wiki/1950_British_Grand_Prix">
            <RaceName>British Grand Prix</RaceName>
            <Circuit circuitId="silverstone" url="http://en.wikipedia.org/wiki/Silverstone_Circuit">
                <CircuitName>Silverstone Circuit</CircuitName>
                <Location lat="52.0786" long="-1.01694">
                    <Locality>Silverstone</Locality>
                    <Country>UK</Country>
                </Location>
            </Circuit>
            <Date>1950-05-13</Date>
        </Race>
        <Race season="1950" round="2" url="http://en.wikipedia.org/wiki/1950_Monaco_Grand_Prix">
            <RaceName>Monaco Grand Prix</RaceName>
            <Circuit circuitId="monaco" url="http://en.wikipedia.org/wiki/Circuit_de_Monaco">
                <CircuitName>Circuit de Monaco</CircuitName>
                <Location lat="43.7347" long="7.42056">
                    <Locality>Monte-Carlo</Locality>
                    <Country>Monaco</Country>
                </Location>
            </Circuit>
            <Date>1950-05-21</Date>
        </Race>
        <Race season="1950" round="3" url="http://en.wikipedia.org/wiki/1950_Indianapolis_500">
            <RaceName>Indianapolis 500</RaceName>
            <Circuit circuitId="indianapolis" url="http://en.wikipedia.org/wiki/Indianapolis_Motor_Speedway">
                <CircuitName>Indianapolis Motor Speedway</CircuitName>
                <Location lat="39.795" long="-86.2347">
                    <Locality>Indianapolis</Locality>
                    <Country>USA</Country>
                </Location>
            </Circuit>
            <Date>1950-05-30</Date>
        </Race>
        <Race season="1950" round="4" url="http://en.wikipedia.org/wiki/1950_Swiss_Grand_Prix">
            <RaceName>Swiss Grand Prix</RaceName>
            <Circuit circuitId="bremgarten" url="http://en.wikipedia.org/wiki/Circuit_Bremgarten">
                <CircuitName>Circuit Bremgarten</CircuitName>
                <Location lat="46.9589" long="7.40194">
                    <Locality>Bern</Locality>
                    <Country>Switzerland</Country>
                </Location>
            </Circuit>
            <Date>1950-06-04</Date>
        </Race>
        <Race season="1950" round="5" url="http://en.wikipedia.org/wiki/1950_Belgian_Grand_Prix">
            <RaceName>Belgian Grand Prix</RaceName>
            <Circuit circuitId="spa" url="http://en.wikipedia.org/wiki/Circuit_de_Spa-Francorchamps">
                <CircuitName>Circuit de Spa-Francorchamps</CircuitName>
                <Location lat="50.4372" long="5.97139">
                    <Locality>Spa</Locality>
                    <Country>Belgium</Country>
                </Location>
            </Circuit>
            <Date>1950-06-18</Date>
        </Race>
        <Race season="1950" round="6" url="http://en.wikipedia.org/wiki/1950_French_Grand_Prix">
            <RaceName>French Grand Prix</RaceName>
            <Circuit circuitId="reims" url="http://en.wikipedia.org/wiki/Reims-Gueux">
                <CircuitName>Reims-Gueux</CircuitName>
                <Location lat="49.2542" long="3.93083">
                    <Locality>Reims</Locality>
                    <Country>France</Country>
                </Location>
            </Circuit>
            <Date>1950-07-02</Date>
        </Race>
        <Race season="1950" round="7" url="http://en.wikipedia.org/wiki/1950_Italian_Grand_Prix">
            <RaceName>Italian Grand Prix</RaceName>
            <Circuit circuitId="monza" url="http://en.wikipedia.org/wiki/Autodromo_Nazionale_Monza">
                <CircuitName>Autodromo Nazionale di Monza</CircuitName>
                <Location lat="45.6156" long="9.28111">
                    <Locality>Monza</Locality>
                    <Country>Italy</Country>
                </Location>
            </Circuit>
            <Date>1950-09-03</Date>
        </Race>
    </RaceTable>
</MRData>

标签: xmlapirestrest-assured

解决方案


所需进口;

import io.restassured.RestAssured;
import io.restassured.path.xml.XmlPath;
import io.restassured.response.Response;
import java.util.List;

您应该XmlPath在 RestAssured 中使用来访问和处理 xml 响应。

Response response =
    RestAssured
    .when()
    .get("http://ergast.com/api/f1")
    .then()
    .extract()
    .response();

XmlPath xmlPath = response.xmlPath();
int numberOfCircuits = xmlPath.getList("MRData.RaceTable.Race.Circuit").size();

numberOfCircuits将返回响应中的电路节点数。

您可以从xmlPath.

或者你可以在没有清单的情况下得到它;

int numberOfCircuits = xmlPath.get("MRData.RaceTable.Race.Circuit.size()");

推荐阅读