#java #xml #file #sax #writer
#java #xml #файл #sax #writer
Вопрос:
У меня есть несколько 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();
}
}
Ответ №1:
Используя 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;
}
}