Skip to content

Commit 7a5bfa6

Browse files
committed
Fix #252: optional root tag in SimpleXmlEncoder
Adds a new option to the `SimpleXmlEncoder` which controls whether a root tag is written or not. The method for setting the new option is called `setWriteRootTag()`.
1 parent 0099bd1 commit 7a5bfa6

File tree

2 files changed

+58
-16
lines changed

2 files changed

+58
-16
lines changed

src/main/java/org/culturegraph/mf/stream/converter/xml/SimpleXmlEncoder.java

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public final class SimpleXmlEncoder extends DefaultStreamPipe<ObjectReceiver<Str
7171
private String rootTag = DEFAULT_ROOT_TAG;
7272
private String recordTag = DEFAULT_RECORD_TAG;
7373
private Map<String, String> namespaces = new HashMap<String, String>();
74+
private boolean writeRootTag = true;
7475
private boolean writeXmlHeader = true;
7576
private boolean separateRoots;
7677

@@ -103,6 +104,10 @@ public void setWriteXmlHeader(final boolean writeXmlHeader) {
103104
this.writeXmlHeader = writeXmlHeader;
104105
}
105106

107+
public void setWriteRootTag(final boolean writeRootTag) {
108+
this.writeRootTag = writeRootTag;
109+
}
110+
106111
public void setSeparateRoots(final boolean separateRoots) {
107112
this.separateRoots = separateRoots;
108113
}
@@ -126,6 +131,17 @@ public void startRecord(final String identifier) {
126131
atStreamStart = false;
127132

128133
element = new Element(recordTag);
134+
if (!writeRootTag) {
135+
addNamespacesToElement();
136+
}
137+
}
138+
139+
private void addNamespacesToElement() {
140+
for (final Entry<String, String> namespace : namespaces.entrySet()) {
141+
final String key = namespace.getKey();
142+
final String name = XMLNS_MARKER + (key.isEmpty() ? "" : ":") + key;
143+
element.addAttribute(name, namespace.getValue());
144+
}
129145
}
130146

131147
@Override
@@ -184,27 +200,30 @@ private void writeHeader() {
184200
if (writeXmlHeader) {
185201
builder.append(XML_HEADER);
186202
}
187-
188-
builder.append(BEGIN_OPEN_ELEMENT);
189-
builder.append(rootTag);
190-
for (final Entry<String, String> entry : namespaces.entrySet()) {
191-
builder.append(XMLNS_MARKER);
192-
if (!entry.getKey().isEmpty()) {
193-
builder.append(':');
194-
builder.append(entry.getKey());
203+
if (writeRootTag) {
204+
builder.append(BEGIN_OPEN_ELEMENT);
205+
builder.append(rootTag);
206+
for (final Entry<String, String> entry : namespaces.entrySet()) {
207+
builder.append(XMLNS_MARKER);
208+
if (!entry.getKey().isEmpty()) {
209+
builder.append(':');
210+
builder.append(entry.getKey());
211+
}
212+
builder.append(BEGIN_ATTRIBUTE);
213+
writeEscaped(builder, entry.getValue());
214+
builder.append(END_ATTRIBUTE);
195215
}
196-
builder.append(BEGIN_ATTRIBUTE);
197-
writeEscaped(builder, entry.getValue());
198-
builder.append(END_ATTRIBUTE);
216+
builder.append(END_OPEN_ELEMENT);
199217
}
200-
builder.append(END_OPEN_ELEMENT);
201218
}
202219

203220
private void writeFooter() {
204-
builder.append(NEW_LINE);
205-
builder.append(BEGIN_CLOSE_ELEMENT);
206-
builder.append(rootTag);
207-
builder.append(END_CLOSE_ELEMENT);
221+
if (writeRootTag) {
222+
builder.append(NEW_LINE);
223+
builder.append(BEGIN_CLOSE_ELEMENT);
224+
builder.append(rootTag);
225+
builder.append(END_CLOSE_ELEMENT);
226+
}
208227
}
209228

210229
protected static void writeEscaped(final StringBuilder builder, final String str) {

src/test/java/org/culturegraph/mf/stream/converter/xml/SimpleXmlEncoderTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,29 @@ public void shouldAddNamespaceWithEmptyKeyAsDefaultNamespace() {
117117
getResultXml());
118118
}
119119

120+
@Test
121+
public void shouldNotEmitRootTagIfWriteRootTagIsFalse() {
122+
simpleXmlEncoder.setWriteRootTag(false);
123+
124+
emitEmptyRecord();
125+
126+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><record />",
127+
getResultXml());
128+
}
129+
130+
@Test
131+
public void shouldAddNamespacesToRecordTagIfWriteRootTagIsFalse() {
132+
final Map<String, String> namespaces = new HashMap<String, String>();
133+
namespaces.put("ns", "http://example.org/ns");
134+
simpleXmlEncoder.setNamespaces(namespaces);
135+
simpleXmlEncoder.setWriteRootTag(false);
136+
137+
emitEmptyRecord();
138+
139+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><record xmlns:ns=\"http://example.org/ns\" />",
140+
getResultXml());
141+
}
142+
120143
private void emitTwoRecords() {
121144
simpleXmlEncoder.startRecord("X");
122145
simpleXmlEncoder.literal(TAG, VALUE);

0 commit comments

Comments
 (0)