gpt4 book ai didi

java - 如何使用现有 XML DOC 的属性创建新的 XML DOC?

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:51 29 4
gpt4 key购买 nike

我有一个如下所示的 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<model>
<id>_1</id>
<nodes>
<id>_2</id>
<stencil>TASK</stencil>
</nodes>
<nodes>
<id>_3</id>
<stencil>TASK</stencil>
</nodes>
</model>

我必须使用第一个文档中的节点属性创建另一个 xml 文档。对于新文档,我必须创建一个父节点称为“定义”。我必须在新文档中创建一个具有以下属性的“流程”节点,而不是第一个文档中的“模型”节点属性“id”,其值与模型的“id”子节点的内容相同。对于第一个文档中的每个“节点”节点如果它们的“stencil”子节点内容等于“TASK”,我会在新的 xml 文档中创建一个“task”节点。

<?xml version="1.0" encoding="UTF-8"?>
<definitions>
<process id="_1">
<task id="_2">
</task>
<task id="_3">
</task>
</process>
</definitions>

为了实现这一目标,我创建了三个类:定义、流程和任务:

public class Definitions {
public Process extractProcess(Document simpleXml_doc) throws XPathExpressionException{
Process p = new Process();
p.setProcess("process");
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression xPathEx1 = xPath.compile("/model/id");
Node n1 = (Node) xPathEx1.evaluate(simpleXml_doc, XPathConstants.NODE);
p.setIdProcess(n1.getTextContent());
return p;
}
}

public class Process {

private String process;
public String getProcess(){
return process;
}
public void setProcess(String process){
this.process = process;
}
private String idProcess;
public String getIdProcess(){
return idProcess;
}
public void setIdProcess(String idProcess){
this.idProcess = idProcess;
}


public ArrayList<Task> extractTasks(Document firstXml_doc) throws XPathExpressionException{
ArrayList<Task> taskList = new ArrayList<>();
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression xPathEx1 = xPath.compile("/model/nodes/stencil");
NodeList nl1 = (NodeList) xPathEx1.evaluate(simpleXml_doc, XPathConstants.NODESET);
for(int index=0; index<nl1.getLength(); index++){
if(nl1.item(index).getTextContent().equals("TASK")){
Task t = new Task();
t.setTask("task");
XPathExpression xPathEx2 = xPath.compile("/model/nodes/id");
NodeList nl2 = (NodeList) xPathEx2.evaluate(simpleXml_doc, XPathConstants.NODESET);
t.setIdTask("_" + nl2.item(index).getTextContent());
taskList.add(t);
}
}
return taskList;
}
}

public class Task {
private String task;
public String getTask(){
return task;
}
public void setTask(String task){
this.task = task;
}
//do krijoj properties per atributet e elementit task
private String idTask;
private String nameTask;
public String getIdTask(){
return idTask;
}
public void setIdTask(String idTask){
this.idTask = idTask;
}
}

我只是想知道这是否是定义各个类的正确方法。谁能告诉我使用此方法为新文档创建和填充节点的任何方法类(class)?我使用 DOM 解析器,我知道如何创建节点和填充属性值,但我总是在一个类中完成这项工作,而不是使用不同的类元素。

最佳答案

我认为您的想法是正确的,但也许您可能想考虑使用 JAXB 来实现此目的。它更干净、更容易理解。使用 JAXB,您将把给定的输入 XML 文件解码为 Java 对象。然后,创建新的 Java 对象并将其编码(marshal)回 XML 字符串/文件。

方法如下...

假设您有以下内容:-

输入 XML 结构

这是您拥有的 XML 结构,并将其放入文件中。

input.xml

<?xml version="1.0" encoding="UTF-8"?>
<model>
<id>_1</id>
<nodes>
<id>_2</id>
<stencil>TASK</stencil>
</nodes>
<nodes>
<id>_3</id>
<stencil>TASK</stencil>
</nodes>
</model>

为输入 XML 创建 Java 对象

模型类

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlRootElement
public class Model {
@XmlElement
private String id;

@XmlElement
private List<Node> nodes;

public Model() {
}

public Model(String id, List<Node> nodes) {
this.id = id;
this.nodes = nodes;
}

public String getId() {
return id;
}

public List<Node> getNodes() {
return nodes;
}
}

节点类

import javax.xml.bind.annotation.XmlElement;

public class Node {

@XmlElement
private String id;

@XmlElement
private String stencil;

public Node() {
}

public Node(String id, String stencil) {
this.id = id;
this.stencil = stencil;
}

public String getId() {
return id;
}

public String getStencil() {
return stencil;
}
}

为输出 XML 创建 JAVA 对象

定义类

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Definitions {

@XmlElement
private Process process;

public Definitions() {
}

public Definitions(Process process) {
this.process = process;
}

public Process getProcess() {
return process;
}
}

流程类

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import java.util.List;

public class Process {

@XmlAttribute
private String id;

@XmlElement
private List<Task> task;

public Process() {
}

public Process(String id, List<Task> task) {
this.id = id;
this.task = task;
}

public String getId() {
return id;
}

public List<Task> getTask() {
return task;
}
}

任务类别

import javax.xml.bind.annotation.XmlAttribute;

public class Task {

@XmlAttribute
private String id;

public Task() {
}

public Task(String id) {
this.id = id;
}

public String getId() {
return id;
}
}

读写 XML

主类

public class Main {
public static void main(String[] args) throws JAXBException {

// initialize JAXB
JAXBContext context = JAXBContext.newInstance(Model.class, Definitions.class);

// Unmarshal input XML into Java object
Unmarshaller unmarshaller = context.createUnmarshaller();
Model model = (Model) unmarshaller.unmarshal(Main.class.getClassLoader().getResourceAsStream("input.xml"));

// Map old Java object to new Java object
List<Task> tasks = new ArrayList<Task>();
for (Node node : model.getNodes()) {
tasks.add(new Task(node.getId()));
}

// Marshal new Java object into XML
Definitions definitions = new Definitions(new Process(model.getId(), tasks));

StringWriter sw = new StringWriter();

Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.marshal(definitions, sw);

System.out.println(sw.toString());
}
}

结果

当您执行上面的代码时,您会得到以下 XML 字符串:-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions>
<process id="_1">
<task id="_2"/>
<task id="_3"/>
</process>
</definitions>

关于java - 如何使用现有 XML DOC 的属性创建新的 XML DOC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22376487/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com