diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/XmlTreeBuilder.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/XmlTreeBuilder.java
index 7d1748bd58e9..7a287cdaa070 100644
--- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/XmlTreeBuilder.java
+++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/XmlTreeBuilder.java
@@ -128,6 +128,8 @@ public BXml parse() {
readComment(xmlStreamReader);
break;
case CDATA:
+ readCData(xmlStreamReader);
+ break;
case CHARACTERS:
readText(xmlStreamReader);
readNext = true;
@@ -158,6 +160,10 @@ private void readPI(XMLStreamReader xmlStreamReader) {
siblingDeque.peek().add(xmlItem);
}
+ private void readCData(XMLStreamReader xmlStreamReader) {
+ siblingDeque.peek().add(new XmlText(xmlStreamReader.getText()));
+ }
+
private void readText(XMLStreamReader xmlStreamReader) throws XMLStreamException {
StringBuilder textBuilder = new StringBuilder();
while (xmlStreamReader.getEventType() == CHARACTERS) {
diff --git a/langlib/langlib-test/src/test/resources/test-src/xmllib_test.bal b/langlib/langlib-test/src/test/resources/test-src/xmllib_test.bal
index 34843030f15b..794e26c793db 100644
--- a/langlib/langlib-test/src/test/resources/test-src/xmllib_test.bal
+++ b/langlib/langlib-test/src/test/resources/test-src/xmllib_test.bal
@@ -943,6 +943,10 @@ function fromStringTest() {
if !(d[3] is xml:Comment) {
panic error("Assertion error: not a comment");
}
+
+ string xmlString = string ``;
+ xml xmlWithCData = checkpanic xml:fromString(xmlString);
+ assertEquals(xmlWithCData, xml `OK`);
}
function testXmlIteratorNextInvocations() {