diff --git a/src/main/java/org/json/XML.java b/src/main/java/org/json/XML.java index d93878f89..e6bf2232f 100644 --- a/src/main/java/org/json/XML.java +++ b/src/main/java/org/json/XML.java @@ -439,7 +439,7 @@ private static boolean parse(XMLTokener x, JSONObject context, String name, XMLP // Jane - public static boolean parseWithPath(XMLTokener x, JSONObject context, String name, XMLParserConfiguration config, List currPath, List targetPath, JSONObject to) + public static boolean parseWithPath(XMLTokener x, JSONObject context, String name, XMLParserConfiguration config, List currPath, List targetPath, JSONObject toReplace) throws JSONException { char c; int i; @@ -478,7 +478,11 @@ public static boolean parseWithPath(XMLTokener x, JSONObject context, String nam string = x.nextCDATA(); if (string.length() > 0) { currPath.add(config.getcDataTagName()); - context.accumulate(config.getcDataTagName(), string); + if (isTwoPathSame(currPath,targetPath)){ + jsonObject.put(string, toReplace); + }else{ + context.accumulate(config.getcDataTagName(), string); + } currPath.remove(currPath.size()-1); } return false; @@ -526,11 +530,18 @@ public static boolean parseWithPath(XMLTokener x, JSONObject context, String nam } else { tagName = (String) token; - token = null; jsonObject = new JSONObject(); boolean nilAttributeFound = false; xmlXsiTypeConverter = null; + currPath.add(tagName); + if (isTwoPathSame(currPath, targetPath)){ + context.put(tagName, toReplace); + x.skipPast(""); + currPath.remove(currPath.size()-1); + return false; + } + for (;;) { if (token == null) { token = x.nextToken(); @@ -539,8 +550,9 @@ public static boolean parseWithPath(XMLTokener x, JSONObject context, String nam if (token instanceof String) { string = (String) token; token = x.nextToken(); - currPath.add(tagName); + if (token == EQ) { + token = x.nextToken(); if (!(token instanceof String)) { throw x.syntaxError("Missing value"); @@ -554,24 +566,29 @@ public static boolean parseWithPath(XMLTokener x, JSONObject context, String nam && TYPE_ATTR.equals(string)) { xmlXsiTypeConverter = config.getXsiTypeMap().get(token); } else if (!nilAttributeFound) { + currPath.add(string); if (isTwoPathSame(currPath,targetPath)){ - System.out.println("Target found"); + jsonObject.put(string, toReplace); + }else{ + jsonObject.accumulate(string, + config.isKeepStrings() + ? ((String) token) + : stringToValue((String) token)); } - currPath.add(string); - jsonObject.accumulate(string, - config.isKeepStrings() - ? ((String) token) - : stringToValue((String) token)); currPath.remove(currPath.size()-1); } token = null; } else { currPath.add(string); - jsonObject.accumulate(string, ""); + if (isTwoPathSame(currPath,targetPath)){ + jsonObject.accumulate(string, toReplace); + }else{ + jsonObject.accumulate(string, ""); + } currPath.remove(currPath.size()-1); } - currPath.remove(currPath.size()-1); +// currPath.remove(currPath.size()-1); } else if (token == SLASH) { // Empty tag <.../> @@ -580,24 +597,31 @@ public static boolean parseWithPath(XMLTokener x, JSONObject context, String nam } if (config.getForceList().contains(tagName)) { // Force the value to be an array - if (nilAttributeFound) { +// currPath.add(tagName); + if (isTwoPathSame(currPath,targetPath)){ + context.put(tagName, toReplace); + }else if (nilAttributeFound) { context.append(tagName, JSONObject.NULL); } else if (jsonObject.length() > 0) { context.append(tagName, jsonObject); } else { context.put(tagName, new JSONArray()); } +// currPath.remove(currPath.size()-1); } else { - currPath.add(tagName); - if (nilAttributeFound) { +// currPath.add(tagName); + if (isTwoPathSame(currPath,targetPath)){ + context.put(tagName, toReplace); + }else if (nilAttributeFound) { context.accumulate(tagName, JSONObject.NULL); } else if (jsonObject.length() > 0) { context.accumulate(tagName, jsonObject); } else { context.accumulate(tagName, ""); } - currPath.remove(currPath.size()-1); +// currPath.remove(currPath.size()-1); } + currPath.remove(currPath.size()-1); return false; } else if (token == GT) { @@ -612,7 +636,13 @@ public static boolean parseWithPath(XMLTokener x, JSONObject context, String nam } else if (token instanceof String) { string = (String) token; if (string.length() > 0) { - currPath.add(config.getcDataTagName()); +// currPath.add(tagName); + // should not replace here +// if(isTwoPathSame(currPath, targetPath)){ +// context.put(tagName, toReplace); +// x.skipPast(""); +// return false; +// } if(xmlXsiTypeConverter != null) { jsonObject.accumulate(config.getcDataTagName(), stringToValue(string, xmlXsiTypeConverter)); @@ -620,13 +650,13 @@ public static boolean parseWithPath(XMLTokener x, JSONObject context, String nam jsonObject.accumulate(config.getcDataTagName(), config.isKeepStrings() ? string : stringToValue(string)); } - currPath.remove(currPath.size()-1); +// currPath.remove(currPath.size()-1); } } else if (token == LT) { // Nested element - currPath.add(tagName); - if (parseWithPath(x, jsonObject, tagName, config, currPath, targetPath, to)) { +// currPath.add(tagName); + if (parseWithPath(x, jsonObject, tagName, config, currPath, targetPath, toReplace)) { if (config.getForceList().contains(tagName)) { // Force the value to be an array @@ -638,10 +668,7 @@ public static boolean parseWithPath(XMLTokener x, JSONObject context, String nam } else { context.append(tagName, jsonObject); } - System.out.println(currPath.toString() + jsonObject.toString()); -// currPath.remove(currPath.size()-1); } else { -// currPath.add(tagName); if (jsonObject.length() == 0) { context.accumulate(tagName, ""); } else if (jsonObject.length() == 1 @@ -650,13 +677,9 @@ public static boolean parseWithPath(XMLTokener x, JSONObject context, String nam } else { context.accumulate(tagName, jsonObject); } - System.out.println(currPath.toString() + jsonObject.toString()); -// currPath.remove(currPath.size()-1); } currPath.remove(currPath.size()-1); return false; - }else{ - currPath.remove(currPath.size()-1); } } diff --git a/src/test/java/org/json/junit/XMLTest.java b/src/test/java/org/json/junit/XMLTest.java index ce7fbdcc2..fca3abd76 100644 --- a/src/test/java/org/json/junit/XMLTest.java +++ b/src/test/java/org/json/junit/XMLTest.java @@ -303,18 +303,18 @@ public void testParseWithPath(){ String expectedStr = "{\"addresses\":{\"address\":{\"street\":\"[CDATA[Baker street 5]\","+ - "\"name\":\"Joe Tester\",\"NothingHere\":\"\",TrueValue:true,\n"+ + "\"name\":\"Joe Tester\",\"NothingHere\":\"\",TrueValue:{},\n"+ "\"FalseValue\":false,\"NullValue\":null,\"PositiveValue\":42,\n"+ "\"NegativeValue\":-23,\"DoubleValue\":-23.45,\"Nan\":-23x.45,\n"+ "\"ArrayOfNum\":\"1, 2, 3, 4.1, 5.2\"\n"+ "},\"xsi:noNamespaceSchemaLocation\":"+ "\"test.xsd\",\"xmlns:xsi\":\"http://www.w3.org/2001/"+ "XMLSchema-instance\"}}"; - JSONObject expectedJsonObject = new JSONObject(expectedStr); Reader reader = new StringReader(xmlStr); JSONPointer pointer = new JSONPointer("/addresses/address/TrueValue"); - JSONObject jsonObject = XML.toJSONObject(reader, pointer, new JSONObject()); + JSONObject actualJsonObject = XML.toJSONObject(reader, pointer, new JSONObject()); + Util.compareActualVsExpectedJsonObjects(actualJsonObject,expectedJsonObject); }