复制节点在同一个输出xml文件-java [英] Copy nodes in the same output xml file -java

查看:131
本文介绍了复制节点在同一个输出xml文件-java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

1.这是我的示例文件example.xml

1.This is my example file "example.xml"

<?xml version="1.0" encoding="UTF-8"?>
  <VER>7.0</VER>
    <NATIONALITY>FIN</NATIONALITY>
    <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
    <MARKE>KIA</MARKE>
   <DATA>

2.这是我的java代码解析文件example.xml:

2.This is my java code that parses the file "example.xml" :

 public static void main(String argv[]) {
try {
   Properties prop = System.getProperties();
   File file = new File("E:/workspace/example.xml");
   DocumentBuilderFactory dbildfactory =DocumentBuilderFactory.newInstance();
   DocumentBuilder dbild = dbildfactory.newDocumentBuilder();
   Document doc = dbild.parse(file);
   doc.getDocumentElement().normalize();
   NodeList nodeL = doc.getElementsByTagName("ALL");

   for (int s = 0; s < nodeL.getLength(); s++) {
   Node nodde = nodeL.item(s);

    if (nodde.getNodeType() == Node.ELEMENT_NODE){ 

    Element fstElmnt = (Element) nodde;

    NodeList list = fstElmnt.getElementsByTagName("MARKE");
    Element disp = (Element) list.item(0);
    NodeList dispmarke = disp.getChildNodes();
    System.out.println("<MARKE>" + ((Node)               

    dispmarke.item(0)).getNodeValue() + "</MARKE>");
    String dispbrd = prop.getProperty("prop4");
    ((Node) dispmarke.item(0)).setNodeValue(dispbrd);
    System.out.println("<MARKE>" + ((Node)     

    dispmarke.item(0)).getNodeValue() + "</MARKE>");

    if(dispmarke.item(0).getNodeValue().equals("LEX") ){

      NodeList nod = fstElmnt.getElementsByTagName("MARKE");
      Element element = (Element) nod.item(0);
      NodeList mod = element.getChildNodes();
      System.out.println("<MARKE>" + ((Node) mod.item(0)).getNodeValue() + "</MARKE>");
      prop.put("norm", "X300");
      ((Node) mod.item(0)).setNodeValue(prop.getProperty("norm"));
      System.out.println("<MARKE>" + ((Node) mod.item(0)).getNodeValue() + "</MARKE>"); 
      }
    }

}

      TransformerFactory transformerFactory = 
      TransformerFactory.newInstance();
      Transformer transformer = 
      transformerFactory.newTransformer();
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
      DOMSource source = new DOMSource(doc);
      StreamResult console = new StreamResult(System.out);
      StreamResult fil = new StreamResult(new File("E:/workspace/res/output.xml"));
      transformer.transform(source, console);
      transformer.transform(source, fil);
      }

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

3.此时,节点保存到一个新文件output.xml:

3.At this time, the nodes are saved to a new file "output.xml":

 <?xml version="1.0" encoding="UTF-8"?>
 <ALL>
  <VER>7.0</VER>
    <NATIONALITY>FIN</NATIONALITY>
    <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
    <MARKE>KIA</MARKE>
   <DATA>
  </ALL>

4.我想要的是,文件output.xml中有几个节点副本。
此节点在上一个节点之后启动的每个人:

4.I would like that, there were several copies of nodes in file output.xml. Everyone this node started after the last node:

<?xml version="1.0" encoding="UTF-8"?>

  <ALL>
    <VER>7.0</VER>
     <NATIONALITY>FIN</NATIONALITY>
      <DATA>
      <USER>ED</USER>
      <PLZ>XXX</PLZ>
      <BEGIN>2015-05-16</BEGIN>
       <CURRENCY>90</CURRENCY>
       <MARKE>KIA</MARKE>
       <DATA>
     </ALL> 
   <ALL>
     <VER>7.0</VER>
      <NATIONALITY>FIN</NATIONALITY>
      <DATA>
        <USER>ED</USER>
        <PLZ>XXX</PLZ>
        <BEGIN>2015-05-16</BEGIN>
        <CURRENCY>90</CURRENCY>
        <MARKE>KIA</MARKE>
        <DATA>
      </ALL>
  ...

5.如何在Java中最简单的方法?为什么循环?

5.How can the easiest way to do this in Java? What loops used for this?

推荐答案

我不得不修改你的输入XML来创建根元素:

I had to fix your input XML to have a root element:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
  <VER>7.0</VER>
    <NATIONALITY>FIN</NATIONALITY>
    <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
    <MARKE>KIA</MARKE>
   </DATA>
</ROOT>   

然后我可以使用 XMLBeam (一个数据投影库,披露:我隶属于这个项目)到

Then I could use XMLBeam (A data projection library, DISCLOSURE: I'm affiliated with this project) to


  1. 读取输入,

  2. 将其包装成全部元素

  3. 复制输入和

  4. 打印出来

  1. read the input,
  2. wrap it into an ALL Element
  3. duplicate the input and
  4. print it out







import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import org.xmlbeam.XBProjector;
import org.xmlbeam.XBProjector.Flags;
import org.xmlbeam.annotation.XBWrite;
import org.xmlbeam.dom.DOMAccess;

@SuppressWarnings("javadoc")
public class DuplicateNode {

    // Projection to embed some nodes into an "ALL" element
    public interface AllNodes {
        @XBWrite("./*")
        AllNodes setNodes(List<DOMAccess> nodes);
    };

    // Projection for the output document
    public interface OutputProjection {
        @XBWrite("/ROOT/*")
        void setNodes(List<AllNodes> nodes);
    };

    public static void main(String[] args) throws IOException {
        // Create the projector we will use to project the data
        XBProjector projector = new XBProjector(Flags.TO_STRING_RENDERS_XML);

        //Read all nodes from input document
        List<DOMAccess> nodes =projector.io().url("res://example.xml").evalXPath("/ROOT/*").asListOf(DOMAccess.class);

        // Create some copies
        List<AllNodes> newNodeList = new LinkedList<AllNodes>();
        newNodeList.add(projector.projectEmptyElement("ALL",AllNodes.class).setNodes(nodes));
        newNodeList.add(projector.projectEmptyElement("ALL",AllNodes.class).setNodes(nodes));
        //...

        // Create an output projection that will take the copied nodes
        OutputProjection outputProjection = projector.projectEmptyDocument(OutputProjection.class);

        // set nodes to the output projection
        outputProjection.setNodes(newNodeList);

        // print it out (or write to file, stream,...)
        System.out.println(outputProjection);
    }
}

此程序打印出来:

<ROOT>
  <ALL>
    <VER>7.0</VER>
    <NATIONALITY>FIN</NATIONALITY>
    <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
    <MARKE>KIA</MARKE>
   </DATA>
  </ALL>
  <ALL>
    <VER>7.0</VER>
    <NATIONALITY>FIN</NATIONALITY>
    <DATA>
    <USER>ED</USER>
    <PLZ>XXX</PLZ>
    <BEGIN>2015-05-16</BEGIN>
    <CURRENCY>90</CURRENCY>
    <MARKE>KIA</MARKE>
   </DATA>
  </ALL>
</ROOT>

这篇关于复制节点在同一个输出xml文件-java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆