Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * $Id$
  3. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  4. * For details on use and redistribution please refer to the
  5. * LICENSE file included with these sources.
  6. */
  7. package org.apache.fop.render.xml;
  8. import org.apache.fop.fo.FOUserAgent;
  9. import org.apache.fop.render.XMLHandler;
  10. import org.apache.fop.render.RendererContext;
  11. import org.apache.batik.dom.util.DOMUtilities;
  12. import org.w3c.dom.Document;
  13. import org.w3c.dom.Node;
  14. import org.w3c.dom.NamedNodeMap;
  15. import org.w3c.dom.Attr;
  16. import java.io.Writer;
  17. import java.io.IOException;
  18. /**
  19. */
  20. public class XMLXMLHandler implements XMLHandler {
  21. public static final String WRITER = "writer";
  22. public XMLXMLHandler() {
  23. }
  24. public void handleXML(RendererContext context, Document doc,
  25. String ns) throws Exception {
  26. Writer writer = (Writer) context.getProperty(WRITER);
  27. String svg = "http://www.w3.org/2000/svg";
  28. // actually both do the same thing but one requires
  29. // batik
  30. if (svg.equals(ns)) {
  31. DOMUtilities.writeDocument(doc, writer);
  32. } else {
  33. writeDocument(doc, writer);
  34. }
  35. writer.write("\n");
  36. }
  37. /**
  38. * Writes the given document using the given writer.
  39. */
  40. public static void writeDocument(Document doc,
  41. Writer w) throws IOException {
  42. for (Node n = doc.getFirstChild(); n != null;
  43. n = n.getNextSibling()) {
  44. writeNode(n, w);
  45. }
  46. }
  47. /**
  48. * Writes a node using the given writer.
  49. */
  50. public static void writeNode(Node n, Writer w) throws IOException {
  51. switch (n.getNodeType()) {
  52. case Node.ELEMENT_NODE:
  53. w.write("<");
  54. w.write(n.getNodeName());
  55. if (n.hasAttributes()) {
  56. NamedNodeMap attr = n.getAttributes();
  57. int len = attr.getLength();
  58. for (int i = 0; i < len; i++) {
  59. Attr a = (Attr) attr.item(i);
  60. w.write(" ");
  61. w.write(a.getNodeName());
  62. w.write("=\"");
  63. w.write(contentToString(a.getNodeValue()));
  64. w.write("\"");
  65. }
  66. }
  67. Node c = n.getFirstChild();
  68. if (c != null) {
  69. w.write(">");
  70. for (; c != null; c = c.getNextSibling()) {
  71. writeNode(c, w);
  72. }
  73. w.write("</");
  74. w.write(n.getNodeName());
  75. w.write(">");
  76. } else {
  77. w.write("/>");
  78. }
  79. break;
  80. case Node.TEXT_NODE:
  81. w.write(contentToString(n.getNodeValue()));
  82. break;
  83. case Node.CDATA_SECTION_NODE:
  84. w.write("<![CDATA[");
  85. w.write(n.getNodeValue());
  86. w.write("]]>");
  87. break;
  88. case Node.ENTITY_REFERENCE_NODE:
  89. w.write("&");
  90. w.write(n.getNodeName());
  91. w.write(";");
  92. break;
  93. case Node.PROCESSING_INSTRUCTION_NODE:
  94. w.write("<?");
  95. w.write(n.getNodeName());
  96. w.write(n.getNodeValue());
  97. w.write("?>");
  98. break;
  99. case Node.COMMENT_NODE:
  100. w.write("<!--");
  101. w.write(n.getNodeValue());
  102. w.write("-->");
  103. break;
  104. case Node.DOCUMENT_TYPE_NODE:
  105. break;
  106. default:
  107. throw new Error("Internal error (" + n.getNodeType() + ")");
  108. }
  109. }
  110. /**
  111. * Returns the given content value transformed to replace invalid
  112. * characters with entities.
  113. */
  114. public static String contentToString(String s) {
  115. StringBuffer result = new StringBuffer();
  116. for (int i = 0; i < s.length(); i++) {
  117. char c = s.charAt(i);
  118. switch (c) {
  119. case '<':
  120. result.append("&lt;");
  121. break;
  122. case '>':
  123. result.append("&gt;");
  124. break;
  125. case '&':
  126. result.append("&amp;");
  127. break;
  128. case '"':
  129. result.append("&quot;");
  130. break;
  131. case '\'':
  132. result.append("&apos;");
  133. break;
  134. default:
  135. result.append(c);
  136. }
  137. }
  138. return result.toString();
  139. }
  140. }