2014-03-13 31 views
1

我有一個XML文檔看起來像這樣:如何使用現有屬性創建新的XML DOC?

<?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」的新文檔中創建一個「process」節點,該值與模型的「id」子節點的內容相同。對於第一個doc中的每個「節點」節點,如果它們的「模板」子節點內容等於「TASK」,我在新的xml文檔中創建一個「任務」節點。

<?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; 
    } 
} 

我只是想知道這是否是定義各個類別的正確方法。 任何人都可以告訴我用這個 類創建和填充新文檔的節點的方法嗎? 我與DOM解析器一起使用,我知道如何創建節點並填充屬性值,但我一直在單個類中完成這項工作,而不是對 元素使用不同的類。

+0

考慮到您對問題的定義,我會將其作爲純粹的過程代碼來處理:編寫一些內容來處理輸入文檔,提取所需的信息,並將結果值作爲新的XML文檔輸出,而不是構建完整的你已經開始做的特定於應用程序的數據模型。或者只寫一個表達你想要的轉換的XSLT樣式表。 – keshlam

回答

1

我認爲你在這裏有正確的想法,但也許你可能想考慮使用JAXB。它更乾淨,更易於理解。使用JAXB,您將將給定的輸入XML文件解組爲Java對象。然後,您創建新的Java對象並將其編組回到XML字符串/文件。

這裏的

如何?讓我們假設你具備以下條件: -

輸入XML結構

這是你的XML結構,你把它放在一個文件中。

輸入。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> 

CREATING Java對象FOR INPUT XML

模型類

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; 
    } 
} 

創建Java對象FOR OUTPUT XML

定義類

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> 
+0

真的很有幫助,很好的解釋。謝謝 –

相關問題