diff --git a/src/main/java/org/json/JSONML.java b/src/main/java/org/json/JSONML.java index c418ed7..a58137e 100644 --- a/src/main/java/org/json/JSONML.java +++ b/src/main/java/org/json/JSONML.java @@ -280,6 +280,55 @@ public class JSONML { } + + /** + * Convert a well-formed (but not necessarily valid) XML string into a + * JSONArray using the JsonML transform. Each XML tag is represented as + * a JSONArray in which the first element is the tag name. If the tag has + * attributes, then the second element will be JSONObject containing the + * name/value pairs. If the tag contains children, then strings and + * JSONArrays will represent the child tags. + * As opposed to toJSONArray this method does not attempt to convert + * any text node or attribute value to any type + * but just leaves it as a string. + * Comments, prologs, DTDs, and
{@code <[ [ ]]>} are ignored.
+ * @param string The source string.
+ * @param config The XML parser configuration:
+ * XMLtoJSONMLParserConfiguration.ORIGINAL is the default behaviour;
+ * XMLtoJSONMLParserConfiguration.KEEP_STRINGS means values will not be coerced into boolean
+ * or numeric values and will instead be left as strings
+ * @return A JSONArray containing the structured data from the XML string.
+ * @throws JSONException Thrown on error converting to a JSONArray
+ */
+ public static JSONArray toJSONArray(String string, XMLtoJSONMLParserConfiguration config) throws JSONException {
+ return (JSONArray)parse(new XMLTokener(string), true, null, config, 0);
+ }
+
+
+ /**
+ * Convert a well-formed (but not necessarily valid) XML string into a
+ * JSONArray using the JsonML transform. Each XML tag is represented as
+ * a JSONArray in which the first element is the tag name. If the tag has
+ * attributes, then the second element will be JSONObject containing the
+ * name/value pairs. If the tag contains children, then strings and
+ * JSONArrays will represent the child content and tags.
+ * As opposed to toJSONArray this method does not attempt to convert
+ * any text node or attribute value to any type
+ * but just leaves it as a string.
+ * Comments, prologs, DTDs, and {@code <[ [ ]]>} are ignored.
+ * @param x An XMLTokener.
+ * @param config The XML parser configuration:
+ * XMLtoJSONMLParserConfiguration.ORIGINAL is the default behaviour;
+ * XMLtoJSONMLParserConfiguration.KEEP_STRINGS means values will not be coerced into boolean
+ * or numeric values and will instead be left as strings
+ * @return A JSONArray containing the structured data from the XML string.
+ * @throws JSONException Thrown on error converting to a JSONArray
+ */
+ public static JSONArray toJSONArray(XMLTokener x, XMLtoJSONMLParserConfiguration config) throws JSONException {
+ return (JSONArray)parse(x, true, null, config, 0);
+ }
+
+
/**
* Convert a well-formed (but not necessarily valid) XML string into a
* JSONArray using the JsonML transform. Each XML tag is represented as
diff --git a/src/test/java/org/json/junit/JSONMLTest.java b/src/test/java/org/json/junit/JSONMLTest.java
index 6a5062e..7d0a285 100644
--- a/src/test/java/org/json/junit/JSONMLTest.java
+++ b/src/test/java/org/json/junit/JSONMLTest.java
@@ -835,7 +835,71 @@ public class JSONMLTest {
}
@Test
- public void testMaxNestingDepthOf42IsRespected() {
+ public void testToJSONArrayMaxNestingDepthOf42IsRespected() {
+ final String wayTooLongMalformedXML = new String(new char[6000]).replace("\0", "");
+
+ final int maxNestingDepth = 42;
+
+ try {
+ JSONML.toJSONArray(wayTooLongMalformedXML, XMLtoJSONMLParserConfiguration.ORIGINAL.withMaxNestingDepth(maxNestingDepth));
+
+ fail("Expecting a JSONException");
+ } catch (JSONException e) {
+ assertTrue("Wrong throwable thrown: not expecting message <" + e.getMessage() + ">",
+ e.getMessage().startsWith("Maximum nesting depth of " + maxNestingDepth));
+ }
+ }
+
+
+ @Test
+ public void testToJSONArrayMaxNestingDepthIsRespectedWithValidXML() {
+ final String perfectlyFineXML = "