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

如何在Java中修改XML中指定name的job节点?

Got it, let's tackle this problem of modifying a specific <job> node by its <name> in your XML. Here are a few reliable Java approaches you can use, with concrete code examples to make it easy to follow:

1. 使用Java原生DOM API

The DOM API comes built right into Java, so you don't need any external libraries. It's a bit verbose, but perfect for small to medium XML files where you don't want to add dependencies.

Here's a complete example that finds the job with name="Job2" and updates its <time> and <status> values:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.StringReader;
import org.xml.sax.InputSource;

public class XmlDomModifier {
    public static void main(String[] args) {
        try {
            // 1. Parse XML (use StringReader if working with an XML string instead of file)
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            
            // Option 1: Parse from file
            // Document doc = builder.parse(new File("jobs.xml"));
            
            // Option 2: Parse from XML string
            String xmlContent = "<list> <job> <id>B001</id> <name>Job1</name> <time>7</time> <status>success</status> </job> <job> <id>B002</id> <name>Job2</name> <time>1</time> <status>success</status> </job> </list>";
            InputSource inputSource = new InputSource(new StringReader(xmlContent));
            Document doc = builder.parse(inputSource);

            // 2. Get all <job> nodes
            NodeList jobNodes = doc.getElementsByTagName("job");

            // 3. Traverse to find the target job by name
            String targetName = "Job2";
            for (int i = 0; i < jobNodes.getLength(); i++) {
                Element jobElement = (Element) jobNodes.item(i);
                Element nameElement = (Element) jobElement.getElementsByTagName("name").item(0);
                String currentName = nameElement.getTextContent();

                if (targetName.equals(currentName)) {
                    // Update <time> value
                    Element timeElement = (Element) jobElement.getElementsByTagName("time").item(0);
                    timeElement.setTextContent("5");
                    
                    // Update <status> value
                    Element statusElement = (Element) jobElement.getElementsByTagName("status").item(0);
                    statusElement.setTextContent("in_progress");
                    
                    break; // Exit loop once target is found
                }
            }

            // 4. Write modified XML back to file or string
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // Pretty print output
            
            // Option 1: Write to file
            // StreamResult result = new StreamResult(new File("updated_jobs.xml"));
            
            // Option 2: Write to string
            StreamResult result = new StreamResult(new StringWriter());
            transformer.transform(new DOMSource(doc), result);
            String updatedXml = result.getWriter().toString();
            System.out.println("Updated XML:\n" + updatedXml);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. 使用JDOM2(更简洁的第三方库)

JDOM2 simplifies XML handling with a more intuitive, less boilerplate-heavy API. You'll need to add its dependency first:

For Maven, add this to your pom.xml:

<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom2</artifactId>
    <version>2.0.6.1</version>
</dependency>

Here's the streamlined code example:

import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;

public class JdomXmlModifier {
    public static void main(String[] args) {
        try {
            // Parse XML string
            String xmlContent = "<list> <job> <id>B001</id> <name>Job1</name> <time>7</time> <status>success</status> </job> <job> <id>B002</id> <name>Job2</name> <time>1</time> <status>success</status> </job> </list>";
            SAXBuilder saxBuilder = new SAXBuilder();
            Document doc = saxBuilder.build(new StringReader(xmlContent));
            Element root = doc.getRootElement();

            // Get all <job> elements
            List<Element> jobElements = root.getChildren("job");

            // Find and modify target job
            String targetName = "Job2";
            for (Element job : jobElements) {
                if (targetName.equals(job.getChildText("name"))) {
                    job.getChild("time").setText("5");
                    job.getChild("status").setText("in_progress");
                    break;
                }
            }

            // Output modified XML
            XMLOutputter xmlOutput = new XMLOutputter(Format.getPrettyFormat());
            StringWriter writer = new StringWriter();
            xmlOutput.output(doc, writer);
            System.out.println("Updated XML:\n" + writer.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 使用Jackson XML(对象映射方式)

If you prefer working with Java objects instead of raw XML nodes, Jackson can serialize/deserialize XML to POJOs. This is great for complex XML structures where OOP makes the code more maintainable.

First, add the Jackson XML dependency:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.15.2</version>
</dependency>

Create your POJO classes to map the XML structure:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import java.util.List;

@JacksonXmlRootElement(localName = "list")
public class JobList {
    @JacksonXmlElementWrapper(useWrapping = false) // Avoid extra <jobs> wrapper node
    private List<Job> job;

    // Getters and Setters
    public List<Job> getJob() { return job; }
    public void setJob(List<Job> job) { this.job = job; }
}

class Job {
    private String id;
    private String name;
    private String time;
    private String status;

    // Getters and Setters
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getTime() { return time; }
    public void setTime(String time) { this.time = time; }
    public String getStatus() { return status; }
    public void setStatus(String status) { this.status = status; }
}

Now the code to modify the XML via objects:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class JacksonXmlModifier {
    public static void main(String[] args) {
        try {
            XmlMapper xmlMapper = new XmlMapper();
            String xmlContent = "<list> <job> <id>B001</id> <name>Job1</name> <time>7</time> <status>success</status> </job> <job> <id>B002</id> <name>Job2</name> <time>1</time> <status>success</status> </job> </list>";
            
            // Convert XML to Java object
            JobList jobList = xmlMapper.readValue(xmlContent, JobList.class);

            // Modify target job
            String targetName = "Job2";
            for (Job job : jobList.getJob()) {
                if (targetName.equals(job.getName())) {
                    job.setTime("5");
                    job.setStatus("in_progress");
                    break;
                }
            }

            // Convert modified object back to XML
            String updatedXml = xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jobList);
            System.out.println("Updated XML:\n" + updatedXml);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Quick Recommendation

  • DOM API: Go with this if you want no external dependencies and are dealing with small XML snippets.
  • JDOM2: Best balance of simplicity and functionality for most XML modification tasks.
  • Jackson XML: Ideal for complex XML structures or if you're already using Jackson for JSON processing in your project.

内容的提问来源于stack exchange,提问作者Nguyen Hoang Vu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:01:22