如何使用Java编程将xml文件从xml文件复制到另一个文件?

问题描述 投票:0回答:1

我有一些xml记录如下

<records>
<record>
<name>SK</name>
<age>30</age>
</record>    

<record>
<name>KK</name>
<age>10</age>
</record>

<record>
<name>RK</name>
<age>50</age>
</record>

<record>
    <name>KB</name>
    <age>15</age>
    </record>

</records>

我使用SAX Parser验证记录并消除<20岁。所以现在我想将记录复制到另一个xml文件

<records>
    <record>
    <name>SK</name>
    <age>30</age>
    </record>     

    <record>
    <name>RK</name>
    <age>50</age>  

   </record>
    </records>

我使用递归解析来提取标签和值,并验证年龄> 20的记录。但是我很想知道如何只将年龄> 20的记录复制到另一个文件中。

有人可以帮忙吗?

Java代码如下

//从xml文件中提取标签

    private static void visit(Node node, int level) {
            NodeList list = node.getChildNodes();
            String nodeName = new String();
            String nodeValue = new String();
            // System.out.println(list);
            for (int i = 0; i < list.getLength(); i++) {
                Node childNode = list.item(i);
                if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                    nodeName = childNode.getNodeName().toString();
                    System.out.println(nodeName);

                     if (PROPERTY_AGE.equals(nodeName)) {
                          nodeValue = childNode.getTextContent();
                      System.out.println(nodeName + " : " +                               nodeValue.trim());
                       int age = Integer.parseInt(nodeValue.trim());
                       if(age>20) {


     /* 
Here I would need to copy the current xml between <record></record> to another xml file. 
How can the entire record be extracted using Java?
*/

}
     } 
                        visit(childNode, level + 1);
                    }
                }
            }

        private static void readXMLFileAnddisplayTags(File inputXMLFile) {
            SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
            try {

                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                DefaultHandler handler = new DefaultHandler();
                InputStream inputStream = new FileInputStream(inputXMLFile);
                InputSource is = new InputSource(new InputStreamReader(inputStream, "UTF-8"));
                is.setEncoding("UTF-8");
                Document document = builder.parse(is);

                visit(document, 0);

            } catch (ParserConfigurationException | SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
java xml file sax writer
1个回答
1
投票

使用Jackson-XML-MapperNIO-APIStream-API,您只需几行代码即可实现目标。

 public static void main(String[] args) throws Exception {
    JacksonXmlModule module = new JacksonXmlModule();
    module.setDefaultUseWrapper(false);
    XmlMapper xmlMapper = new XmlMapper(module);

    Records input = xmlMapper.readValue(Files.newInputStream(Paths.get("./records.xml")), Records.class);

    List<Record> above20 = input.getRecord().stream()
      .filter(r -> r.getAge() > 20)
      .collect(Collectors.toList());

    Records output = new Records();
    output.setRecord(above20);
    String xml = xmlMapper.writeValueAsString(output);
    Files.write(Paths.get("./records2.xml"), xml.getBytes(StandardCharsets.UTF_8));
  }

您只需要为两个XML元素定义两个类:

  class Records {    
    private List<Record> record;

    public List<Record> getRecord() {
      return record;
    }
    public void setRecord(List<Record> record) {
      this.record = record;
    }
  }

  class Record {
    private String name;
    private int age;

    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }

    public int getAge() {
      return age;
    }
    public void setAge(int age) {
      this.age = age;
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.