You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2026/10/20 21:02:51 UTC

(jena) branch main updated: GH-4334: Handle inside an rdf:XMLLiteral

This is an automated email from the ASF dual-hosted git repository.

afs pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git


The following commit(s) were added to refs/heads/main by this push:
     new ec33312c6d GH-4334: Handle <rdf:RDF> inside an rdf:XMLLiteral
ec33312c6d is described below

commit ec33312c6d3c5a9294f26b79b70315ac3fba41e2
Author: Andy Seaborne <an...@apache.org>
AuthorDate: Sun Oct 18 20:57:39 2026 +0100

    GH-4334: Handle <rdf:RDF> inside an rdf:XMLLiteral
---
 .../apache/jena/riot/lang/rdfxml/rrx/ParserRRX_SAX.java    | 14 +++++++++++---
 .../riot/lang/rdfxml/rrx_stax_ev/ParserRRX_StAX_EV.java    |  1 +
 .../riot/lang/rdfxml/rrx_stax_sr/ParserRRX_StAX_SR.java    |  1 +
 .../apache/jena/riot/lang/rdfxml/rrx/TestExtraRRX11.java   | 10 ++++++++++
 jena-arq/testing/RIOT/rrx11-files/xmlliteral-rdfRDF1.rdf   |  8 ++++++++
 jena-arq/testing/RIOT/rrx11-files/xmlliteral-rdfRDF2.rdf   |  6 ++++++
 6 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx/ParserRRX_SAX.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx/ParserRRX_SAX.java
index 94bf73bcb9..3307ec660f 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx/ParserRRX_SAX.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx/ParserRRX_SAX.java
@@ -763,9 +763,17 @@ class ParserRRX_SAX
     @Override
     public void endElement(String namespaceURI, String localName, String qName) {
         if ( qNameMatches(rdfNS, rdfRDF, namespaceURI, localName) ) {
-            decIndent();
-            parserMode(ParserMode.TOP);
-            return;
+            if ( ! xmlLiteralCollecting() ) {
+                // </rdf:RDF> matches an opening <rdf:RDF>.
+                // We are not in an XML literal.
+                // Therefore, this is the close of the document <rdf:RDF>.
+                // <rdf:RDF> is not accepted anywhere else.
+                decIndent();
+                parserMode(ParserMode.TOP);
+                if ( TRACE )
+                    trace.println("Element /rdf:RDF");
+                return;
+            }
         }
 
         if ( TRACE ) {
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_ev/ParserRRX_StAX_EV.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_ev/ParserRRX_StAX_EV.java
index e52ccf4f9e..b6e50dd070 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_ev/ParserRRX_StAX_EV.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_ev/ParserRRX_StAX_EV.java
@@ -60,6 +60,7 @@ import org.apache.jena.vocabulary.RDF;
 
 /** StAX events */
 class ParserRRX_StAX_EV {
+    // The StAX SR parser is faster than the StAX EV parser.
     private static int IRI_CACHE_SIZE = 8192;
     private static boolean EVENTS = false;
     public static boolean TRACE = false;
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_sr/ParserRRX_StAX_SR.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_sr/ParserRRX_StAX_SR.java
index 4c35768952..4d3b151e12 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_sr/ParserRRX_StAX_SR.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/rdfxml/rrx_stax_sr/ParserRRX_StAX_SR.java
@@ -58,6 +58,7 @@ import org.apache.jena.vocabulary.RDF;
 
 /* StAX - stream reader */
 class ParserRRX_StAX_SR {
+    // The StAX SR parser is faster than the StAX EV parser.
     private static int IRI_CACHE_SIZE = 8192;
     private static boolean EVENTS = false;
     public static boolean TRACE = false;
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/TestExtraRRX11.java b/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/TestExtraRRX11.java
index 76911d5e14..f7eab2b76b 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/TestExtraRRX11.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/lang/rdfxml/rrx/TestExtraRRX11.java
@@ -213,6 +213,16 @@ public class TestExtraRRX11 {
         checkForError("bad-object-type-3.rdf", false);
     }
 
+    // GH-4334 rdf:RDF inside an rdf:XMLLiteral.
+
+    @Test public void rdfRDF_in_rdfXMLLiteral_1() {
+        goodTest("xmlliteral-rdfRDF1.rdf");
+    }
+
+    @Test public void rdfRDF_in_rdfXMLLiteral_2() {
+        goodTest("xmlliteral-rdfRDF2.rdf");
+    }
+
     /** Parse with no base set by the parser */
     private void noBase(String filename) {
         trackFilename(filename);
diff --git a/jena-arq/testing/RIOT/rrx11-files/xmlliteral-rdfRDF1.rdf b/jena-arq/testing/RIOT/rrx11-files/xmlliteral-rdfRDF1.rdf
new file mode 100644
index 0000000000..c75b0e8632
--- /dev/null
+++ b/jena-arq/testing/RIOT/rrx11-files/xmlliteral-rdfRDF1.rdf
@@ -0,0 +1,8 @@
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ex="http://example.org/">
+  <rdf:Description rdf:about="http://example.org/s">
+    <ex:p rdf:parseType="Literal"><rdf:RDF><rdf:RDF/></rdf:RDF></ex:p>
+  </rdf:Description>
+  <rdf:Description rdf:about="http://example.org/t">
+    <ex:q>lost</ex:q>
+  </rdf:Description>
+</rdf:RDF>
diff --git a/jena-arq/testing/RIOT/rrx11-files/xmlliteral-rdfRDF2.rdf b/jena-arq/testing/RIOT/rrx11-files/xmlliteral-rdfRDF2.rdf
new file mode 100644
index 0000000000..b5a8ae953f
--- /dev/null
+++ b/jena-arq/testing/RIOT/rrx11-files/xmlliteral-rdfRDF2.rdf
@@ -0,0 +1,6 @@
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ex="http://example.org/">
+  <rdf:Description rdf:about="http://example.org/s">
+    <ex:p rdf:parseType="Literal"><x xmlns="http://example.org/x"><rdf:RDF><rdf:Description rdf:about="http://example.org/inner"/></rdf:RDF></x></ex:p>
+    <ex:q>after</ex:q>
+  </rdf:Description>
+</rdf:RDF>