swen922

3309 correct

Sep 30th, 2018
506
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.46 KB | None | 0 0
  1. package com.javarush.task.task33.task3309;
  2.  
  3. import org.w3c.dom.*;
  4.  
  5. import javax.xml.bind.JAXBContext;
  6. import javax.xml.bind.JAXBException;
  7. import javax.xml.bind.Marshaller;
  8. import javax.xml.parsers.DocumentBuilder;
  9. import javax.xml.parsers.DocumentBuilderFactory;
  10. import javax.xml.parsers.ParserConfigurationException;
  11. import javax.xml.transform.OutputKeys;
  12. import javax.xml.transform.Transformer;
  13. import javax.xml.transform.TransformerFactory;
  14. import javax.xml.transform.dom.DOMSource;
  15. import javax.xml.transform.stream.StreamResult;
  16. import java.io.StringWriter;
  17. import java.util.regex.Matcher;
  18. import java.util.regex.Pattern;
  19.  
  20.  
  21. /*
  22. Комментарий внутри xml
  23. */
  24. public class Solution {
  25.  
  26.     public static String toXmlWithComment(Object obj, String tagName, String comment) {
  27.  
  28.         // Создаю документ DOM из объекта в аргументе:
  29.         Document document = null;
  30.         try {
  31.             DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  32.             DocumentBuilder db = dbf.newDocumentBuilder();
  33.             document = db.newDocument();
  34.  
  35.             JAXBContext context = JAXBContext.newInstance(obj.getClass());
  36.             Marshaller marshaller = context.createMarshaller();
  37.             marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
  38.             marshaller.marshal(obj, document);
  39.             document.getDocumentElement().normalize();
  40.  
  41.         } catch (ParserConfigurationException e) {
  42.             e.printStackTrace();
  43.         } catch (JAXBException e) {
  44.             e.printStackTrace();
  45.         }
  46.  
  47.         // достаю root узел
  48.         Node root = document.getDocumentElement();
  49.  
  50.         NodeList nodeList = ((Element) root).getElementsByTagName(tagName);
  51.         for (int i = 0; i < nodeList.getLength(); i++) {
  52.             Node n = nodeList.item(i);
  53.             n.getParentNode().insertBefore(document.createComment(comment), n);
  54.         }
  55.  
  56.         addCDATA(document, root);
  57.  
  58.  
  59.         // еще один метод для конвертации измененного документа DOM в строку
  60.         String result = null;
  61.         try {
  62.             result = convertDOMtoXML(document);
  63.         } catch (Exception e) {
  64.             e.printStackTrace();
  65.         }
  66.  
  67.         return result;
  68.  
  69.     }
  70.  
  71.     public static void addCDATA(Document doc, Node startNode) {
  72.  
  73.         for (Node node = startNode.getFirstChild(); node != null;) {
  74.             Node nextNode = node.getNextSibling();
  75.  
  76.             if (node.getNodeValue() == null) {
  77.  
  78.                 if (hasCDATA(node.getTextContent())) {
  79.  
  80.                     String stringToConvert = node.getTextContent();
  81.  
  82.                     CDATASection cdata = doc.createCDATASection(stringToConvert);
  83.                     node.setTextContent("");
  84.                     node.appendChild(cdata);
  85.  
  86.                 }
  87.             }
  88.  
  89.             if (node.hasChildNodes()) {
  90.                 addCDATA(doc, node);
  91.             }
  92.  
  93.             node = nextNode;
  94.         }
  95.     }
  96.  
  97.  
  98.     // Вспомогательный метод для проверки наличия запрещенных символов " ' < > &
  99.     public static boolean hasCDATA(String check) {
  100.  
  101.         Pattern p = Pattern.compile("[\"\'<>&]");
  102.         Matcher m = p.matcher(check);
  103.         if (m.find()) {
  104.             return true;
  105.         }
  106.         return false;
  107.     }
  108.  
  109.  
  110.     // Вспомогательный метод для конвертации документа в строку:
  111.     public static String convertDOMtoXML(Document DOMDocument) throws Exception {
  112.  
  113.         TransformerFactory tFactory = TransformerFactory.newInstance();
  114.         Transformer transformer = tFactory.newTransformer();
  115.         transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  116.  
  117.         StringWriter writer = new StringWriter();
  118.         StreamResult result = new StreamResult(writer);
  119.         DOMSource source = new DOMSource(DOMDocument);
  120.         transformer.transform(source, result);
  121.         return writer.toString();
  122.     }
  123.  
  124.  
  125.  
  126.     public static void main(String[] args) {
  127.         // Проверочный код
  128.         Dog dog = new Dog();
  129.         dog.age = 5;
  130.         dog.dogName = "Sharik";
  131.         dog.owner = "Arnold";
  132.         dog.owner2 = "Kuzma";
  133.         dog.needCDATA = "need CDATA cause of > ---";
  134.         String x = toXmlWithComment(dog, "dogOwnerXML", "comment Ha-ha-ha-ha!");
  135.         System.out.println(x);
  136.     }
  137. }
Advertisement
Add Comment
Please, Sign In to add comment