You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中从控制台输出的XML文件中提取指定标签?

看起来你已经成功调用了Palo Alto WildFire的API拿到XML响应啦,接下来要从XML里提取指定标签对吧?我来帮你搞定这个~

从API返回的XML中提取指定标签的解决方案

首先先给你的现有代码做个小优化,避免raw类型的警告,同时把响应体单独拿出来方便后续处理:

try { 
    RestTemplate restTemplate = new RestTemplate(); 
    final String url = "https://wildfire.paloaltonetworks.com/publicapi/get/verdict"; 
    String apikey = "f719c27d2063d2e25579681a64ebc1ba"; 
    String hash = "a1a3b09875f9e9acade5623e1cca680009a6c9e0452489931cfa5b0041f4d290"; 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
    MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); 
    map.add("apikey", apikey); 
    map.add("hash", hash); 
    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(map, headers); 
    // 指定泛型<String>,避免raw类型警告
    ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, request, String.class); 
    String xmlResponse = responseEntity.getBody();
    // 接下来就从xmlResponse里提取你要的标签啦
} catch (Exception e) {
    e.printStackTrace();
}

下面给你三种常用的XML标签提取方法,你可以根据自己的需求选:

方法1:XPath(简单直接,适合提取单个/少数标签)

XPath能快速定位到目标标签,比如你要提取<verdict>标签的内容,直接写路径就行:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import java.io.StringReader;
import org.xml.sax.InputSource;

// 拿到xmlResponse之后执行以下代码
try {
    Document doc = DocumentBuilderFactory.newInstance()
            .newDocumentBuilder()
            .parse(new InputSource(new StringReader(xmlResponse)));
    XPath xpath = XPathFactory.newInstance().newXPath();
    
    // 把这里的路径换成你要提取的标签的XPath路径,比如"/wildfire/verdict"
    String tagValue = xpath.evaluate("/wildfire/verdict", doc);
    System.out.println("提取到的标签值:" + tagValue);
} catch (Exception e) {
    e.printStackTrace();
}

方法2:JAXB(优雅映射,适合固定结构的XML)

如果API返回的XML结构是固定的,你可以创建对应的Java实体类,用JAXB自动解析,后续拿数据就像操作普通对象一样:

首先定义和XML结构匹配的实体类(假设XML结构是<wildfire>包裹着apikey、hash、verdict这些标签):

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "wildfire")
public class WildfireResponse {
    private String apikey;
    private String hash;
    private String verdict;

    // JAXB要求必须有无参构造函数
    public WildfireResponse() {}

    // 生成getter和setter方法
    public String getApikey() { return apikey; }
    public void setApikey(String apikey) { this.apikey = apikey; }
    public String getHash() { return hash; }
    public void setHash(String hash) { this.hash = hash; }
    public String getVerdict() { return verdict; }
    public void setVerdict(String verdict) { this.verdict = verdict; }
}

然后在代码里解析XML:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;

// 拿到xmlResponse之后
try {
    JAXBContext jaxbContext = JAXBContext.newInstance(WildfireResponse.class);
    Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
    WildfireResponse response = (WildfireResponse) unmarshaller.unmarshal(new StringReader(xmlResponse));
    
    // 直接通过get方法拿标签值
    System.out.println("Verdict值:" + response.getVerdict());
} catch (Exception e) {
    e.printStackTrace();
}

方法3:DOM解析(手动遍历,适合复杂XML场景)

如果XML结构比较复杂,或者需要灵活处理节点,可以用DOM手动遍历节点:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import java.io.StringReader;
import org.xml.sax.InputSource;

// 拿到xmlResponse之后
try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(new InputSource(new StringReader(xmlResponse)));
    
    // 获取所有名为"verdict"的标签,换成你要的标签名即可
    NodeList nodeList = doc.getElementsByTagName("verdict");
    if (nodeList.getLength() > 0) {
        String tagValue = nodeList.item(0).getTextContent();
        System.out.println("提取到的标签值:" + tagValue);
    } else {
        System.out.println("没找到指定的标签哦");
    }
} catch (Exception e) {
    e.printStackTrace();
}

如果只是提取单个标签,XPath最省心;如果XML结构固定,JAXB用起来最优雅~

内容的提问来源于stack exchange,提问作者shivakrishna karnati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:17:15