diff --git a/jOOQ/src/main/java/org/jooq/XMLFormat.java b/jOOQ/src/main/java/org/jooq/XMLFormat.java
index 8ad7eaade3..28007e6163 100644
--- a/jOOQ/src/main/java/org/jooq/XMLFormat.java
+++ b/jOOQ/src/main/java/org/jooq/XMLFormat.java
@@ -41,11 +41,12 @@ package org.jooq;
*/
public final class XMLFormat {
- final boolean xmlns;
- final boolean format;
- final String newline;
- final int indent;
- final boolean header;
+ final boolean xmlns;
+ final boolean format;
+ final String newline;
+ final int indent;
+ final boolean header;
+ final RecordFormat recordFormat;
public XMLFormat() {
this(
@@ -53,7 +54,8 @@ public final class XMLFormat {
false,
"\n",
2,
- true
+ true,
+ RecordFormat.VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE
);
}
@@ -62,13 +64,15 @@ public final class XMLFormat {
boolean format,
String newline,
int indent,
- boolean header
+ boolean header,
+ RecordFormat recordFormat
) {
this.xmlns = xmlns;
this.format = format;
this.newline = newline;
this.indent = indent;
this.header = header;
+ this.recordFormat = recordFormat;
}
/**
@@ -80,7 +84,8 @@ public final class XMLFormat {
format,
newline,
indent,
- header
+ header,
+ recordFormat
);
}
@@ -100,7 +105,8 @@ public final class XMLFormat {
newFormat,
newline,
indent,
- header
+ header,
+ recordFormat
);
}
@@ -120,7 +126,8 @@ public final class XMLFormat {
format,
newNewline,
indent,
- header
+ header,
+ recordFormat
);
}
@@ -140,7 +147,8 @@ public final class XMLFormat {
format,
newline,
newIndent,
- header
+ header,
+ recordFormat
);
}
@@ -163,7 +171,8 @@ public final class XMLFormat {
format,
newline,
indent,
- newHeader
+ newHeader,
+ recordFormat
);
}
@@ -173,4 +182,48 @@ public final class XMLFormat {
public boolean header() {
return header;
}
+
+ /**
+ * The record format to be applied, defaulting to
+ * {@link RecordFormat#VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE}.
+ */
+ public XMLFormat recordFormat(RecordFormat newRecordFormat) {
+ return new XMLFormat(
+ xmlns,
+ format,
+ newline,
+ indent,
+ header,
+ newRecordFormat
+ );
+ }
+
+ /**
+ * The record format to be applied, defaulting to
+ * {@link RecordFormat#VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE}.
+ */
+ public RecordFormat recordFormat() {
+ return recordFormat;
+ }
+
+ /**
+ * The format of individual XML records.
+ */
+ public enum RecordFormat {
+
+ /**
+ * The default: /record/value[@field="colname"]/text().
+ */
+ VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE,
+
+ /**
+ * Simplified: /record/value/text().
+ */
+ VALUE_ELEMENTS,
+
+ /**
+ * Simplified: /record/colname/text().
+ */
+ COLUMN_NAME_ELEMENTS,
+ }
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java
index 8ffa6411ab..a2340565af 100644
--- a/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java
+++ b/jOOQ/src/main/java/org/jooq/impl/ResultImpl.java
@@ -37,6 +37,8 @@ package org.jooq.impl;
import static java.lang.Math.max;
import static java.lang.Math.min;
+import static org.jooq.XMLFormat.RecordFormat.COLUMN_NAME_ELEMENTS;
+import static org.jooq.XMLFormat.RecordFormat.VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE;
import static org.jooq.impl.DSL.insertInto;
import static org.jooq.impl.DSL.name;
import static org.jooq.impl.DSL.table;
@@ -1052,11 +1054,21 @@ final class ResultImpl implements Result, AttachableInterna
writer.append(newline).append(indent[recordLevel]).append("");
for (int index = 0; index < fields.fields.length; index++) {
+ writer.append(newline).append(indent[valueLevel]);
+
+ String tag = format.recordFormat() == COLUMN_NAME_ELEMENTS
+ ? escapeXML(fields.fields[index].getName())
+ : "value";
+
Object value = record.get(index);
- writer.append(newline).append(indent[valueLevel]).append("");
@@ -1064,7 +1076,7 @@ final class ResultImpl implements Result, AttachableInterna
else {
writer.append(">");
writer.append(escapeXML(format0(value, false, false)));
- writer.append("");
+ writer.append("" + tag + ">");
}
}
@@ -1195,8 +1207,14 @@ final class ResultImpl implements Result, AttachableInterna
Field> field = fields.fields[index];
Object value = record.get(index);
- Element eValue = document.createElement("value");
- eValue.setAttribute("field", field.getName());
+ String tag = format.recordFormat() == COLUMN_NAME_ELEMENTS
+ ? escapeXML(fields.fields[index].getName())
+ : "value";
+
+ Element eValue = document.createElement(tag);
+
+ if (format.recordFormat() == VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE)
+ eValue.setAttribute("field", field.getName());
eRecord.appendChild(eValue);
if (value != null) {
@@ -1265,17 +1283,23 @@ final class ResultImpl implements Result, AttachableInterna
Field> field = fields.fields[index];
Object value = record.get(index);
- AttributesImpl attrs = new AttributesImpl();
- attrs.addAttribute("", "", "field", "CDATA", field.getName());
+ String tag = format.recordFormat() == COLUMN_NAME_ELEMENTS
+ ? escapeXML(fields.fields[index].getName())
+ : "value";
- handler.startElement("", "", "value", attrs);
+ AttributesImpl attrs = new AttributesImpl();
+
+ if (format.recordFormat() == VALUE_ELEMENTS_WITH_FIELD_ATTRIBUTE)
+ attrs.addAttribute("", "", "field", "CDATA", field.getName());
+
+ handler.startElement("", "", tag, attrs);
if (value != null) {
char[] chars = format0(value, false, false).toCharArray();
handler.characters(chars, 0, chars.length);
}
- handler.endElement("", "", "value");
+ handler.endElement("", "", tag);
}
handler.endElement("", "", "record");
diff --git a/jOOQ/src/main/resources/xsd/jooq-export-3.10.0.xsd b/jOOQ/src/main/resources/xsd/jooq-export-3.10.0.xsd
index c3e08ec631..3132e2198d 100644
--- a/jOOQ/src/main/resources/xsd/jooq-export-3.10.0.xsd
+++ b/jOOQ/src/main/resources/xsd/jooq-export-3.10.0.xsd
@@ -38,15 +38,26 @@
+
+
+
+
-
+