Как скопировать XML-запись из XML-файла в другой файл с помощью Java-программирования? - PullRequest
0 голосов
/ 11 марта 2019

У меня есть несколько 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-файл </p>

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

1 Ответ

1 голос
/ 11 марта 2019

Используя Jackson-XML-Mapper , NIO-API и Stream-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;
    }
  }
...