swen922

Untitled

Jun 9th, 2018
398
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.34 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.         // создаю новый объект комментария на основе присланного аргумента String comment:
  51.         Comment commentNode = document.createComment(comment);
  52.  
  53.         // отправляю все в дополнительный метод для обработки
  54.         addComment(document, root, tagName, commentNode);
  55.  
  56.         // еще один метод для конвертации измененного документа DOM в строку
  57.         String result = null;
  58.         try {
  59.             result = convertDOMtoXML(document);
  60.         } catch (Exception e) {
  61.             e.printStackTrace();
  62.         }
  63.  
  64.         return result;
  65.  
  66.     }
  67.  
  68.     // Основной вспомогательный метод – тут самое главное
  69.     public static void addComment(Document doc, Node startNode, String tag, Comment cmnt) {
  70.  
  71.         //Перебираем все узлы, начиная с root
  72.         // Способ итерации подсмотрел в инете: при такой итерации
  73.         // можно удалять и добавлять узлы без выброса исключений
  74.         for (Node node = startNode.getFirstChild(); node != null;) {
  75.             Node nextNode = node.getNextSibling();
  76.  
  77.             // Проверяем таг на соответствие и добавляем комментарий перед ним, если да
  78.             if (node.getNodeName().equals(tag)) {
  79.                 Element el = (Element) node;
  80.                 el.getParentNode().insertBefore(cmnt, node);
  81.             }
  82.  
  83.             // Проверяем таг на наличие запрещенных символов "'<>^
  84.             // и оборачиваем все в CDATA, если есть такой символ
  85.             // Для проверки наличия используем еще один вспомогательный метод hasCDATA()
  86.             // Также ввел вторым условием проверку на тип узла, потому что иначе сует по 2 раза в каждый таг
  87.             if ((hasCDATA(node.getTextContent())) && (node.getNodeType() == 1)) {
  88.  
  89.                 // Достаем исходное текстовое содержание из узла
  90.                 String stringToConvert = node.getTextContent();
  91.  
  92.                 // Создаем объект CDATA, обнуляем текстовое содержимое внутри тага, засовываем в таг новый узел
  93.                 CDATASection cdata = doc.createCDATASection(stringToConvert);
  94.                 node.setTextContent("");
  95.                 node.appendChild(cdata);
  96.  
  97.             }
  98.  
  99.             // Рекурсия для того, чтобы обойти все вложенные таги во всю глубину
  100.             if (node.hasChildNodes()) {
  101.                 addComment(doc, node, tag, cmnt);
  102.             }
  103.  
  104.             // Это кусочек итерации в конце, все остальное в начале
  105.             node = nextNode;
  106.         }
  107.     }
  108.  
  109.    
  110.     // Вспомогательный метод для проверки наличия запрещенных символов " ' < > &
  111.     public static boolean hasCDATA(String check) {
  112.  
  113.         Pattern p = Pattern.compile("[\"\'<>&]");
  114.         Matcher m = p.matcher(check);
  115.         if (m.find()) {
  116.             return true;
  117.         }
  118.         return false;
  119.     }
  120.  
  121.  
  122.     // Вспомогательный метод для конвертации документа в строку:
  123.     public static String convertDOMtoXML(Document DOMDocument) throws Exception {
  124.  
  125.         TransformerFactory tFactory = TransformerFactory.newInstance();
  126.         Transformer transformer = tFactory.newTransformer();
  127.         transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
  128.         transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  129.  
  130.         StringWriter writer = new StringWriter();
  131.         StreamResult result = new StreamResult(writer);
  132.         DOMSource source = new DOMSource(DOMDocument);
  133.         transformer.transform(source, result);
  134.         return writer.toString();
  135.     }
  136.    
  137.  
  138.  
  139.     public static void main(String[] args) {
  140.         // Проверочный код
  141.         Dog dog = new Dog();
  142.         dog.age = 5;
  143.         dog.dogName = "Sharik";
  144.         dog.owner = "Arnold";
  145.         dog.needCDATA = "need CDATA cause of > ---";
  146.         String x = toXmlWithComment(dog, "dogOwnerXML", "comment Ha-ha-ha-ha!");
  147.         System.out.println(x);
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment