Skip to content

Commit

Permalink
fix xml tag name bug
Browse files Browse the repository at this point in the history
  • Loading branch information
aoliaoaoaojiao committed Nov 29, 2022
1 parent abdb01a commit ce39803
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 31 deletions.
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@
<artifactId>hutool-http</artifactId>
<version>5.8.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public class PocoClientImpl implements PocoClient {
private PocoEngine engine;
private String source;

private RootElement rootNode;
public RootElement rootNode;
private boolean isFrozen = false;

public PocoClientImpl() {
Expand Down
76 changes: 48 additions & 28 deletions src/main/java/org/cloud/sonic/driver/poco/util/pocoJsonToXml.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,21 @@

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.cloud.sonic.driver.common.tool.SonicRespException;
import org.apache.commons.lang3.StringEscapeUtils;

import java.util.Map;
import java.util.regex.Pattern;

public class pocoJsonToXml {
/**
* convert json to xml
*
* @param jo JSONObject
*
* @return xml
*/
public static String jsonObjToXml(JSONObject jo){
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+ jsonToXml(jo, "");
public static String jsonObjToXml(JSONObject jo) throws SonicRespException {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + jsonToXml(jo, "");
return xml;
}

Expand All @@ -39,56 +41,63 @@ public static String jsonObjToXml(JSONObject jo){
*
* @param jo JSONObject
* @param gt "\n" shifter
*
* @return XML
*
*/
@SuppressWarnings("rawtypes")
private static String jsonToXml(JSONObject jo, String gt) {
private static String jsonToXml(JSONObject jo, String gt) throws SonicRespException {
StringBuffer xmlStr = new StringBuffer();
try {
JSONObject payload = jo.getJSONObject("payload");
JSONArray children = jo.getJSONArray("children");

xmlStr.append(gt);
xmlStr.append("<");
String name = String.join("__",payload.get("name").toString().split(" "));

if (name.equals("<Root>"))name = "Root";
name = escapingSpecialCharacters(name);
String name = String.join("__", payload.get("name").toString().split(" "));

if (name.equals("<Root>")) name = "Root";
if (!checkName(name)) {
name = "invalidName";
}
xmlStr.append(name);
xmlStr.append(getAttrStr(payload));
xmlStr.append(">\n");
if (children!=null){
for(int i = 0; i < children.size(); i++) {
if (children != null) {
for (int i = 0; i < children.size(); i++) {
JSONObject child = children.getJSONObject(i);
xmlStr.append(jsonToXml(child, gt + "\t"));
}
}
xmlStr.append(gt);
xmlStr.append("</");
xmlStr.append(name);
xmlStr.append(">\n");
addTag(xmlStr, gt, name, true);
} catch (Exception e) {
return "<error>1</error>";
throw new SonicRespException(e.getMessage());
}
return xmlStr.toString();
}

public static StringBuilder getAttrStr(JSONObject payload){
public static void addTag(StringBuffer xmlStr, String gt, String tagName, boolean isItTheEnd) {
xmlStr.append(gt);
if (isItTheEnd) {
xmlStr.append("</");
} else {
xmlStr.append("<");
}
xmlStr.append(tagName);
xmlStr.append(">\n");
}

public static StringBuilder getAttrStr(JSONObject payload) {
StringBuilder sb = new StringBuilder();
sb.append(" ");
for (Map.Entry<String, Object> stringObjectEntry : payload.entrySet()) {
Map.Entry entry = (Map.Entry) stringObjectEntry;
String key = entry.getKey().toString();
String val = entry.getValue().toString();
if (key.equals("zOrders")){
if (key.equals("zOrders")) {
JSONObject zOrders = JSONObject.parseObject(val);
sb.append(String.format("global=\"%s\" ", zOrders.get("global")));
sb.append(String.format("local=\"%s\" ", zOrders.get("local")));
}else if (key.equals("components")){
val = val.replace("\"","");
} else if (key.equals("components")) {
val = val.replace("\"", "");
sb.append(String.format("%s=\"%s\" ", key, val));
} else {
val = escapingSpecialCharacters(val);
Expand All @@ -98,13 +107,24 @@ public static StringBuilder getAttrStr(JSONObject payload){
return sb;
}

private static String escapingSpecialCharacters(String originStr){
if (originStr==null)return null;
originStr = originStr.replace("&","&amp;");
originStr = originStr.replace("<","&lt;");
originStr = originStr.replace(">","&gt;");
originStr = originStr.replace("\"","&quot;");
originStr = originStr.replace("'","&apos;");
private static boolean checkName(String name) {
String re = "^[:A-Z_a-z\\u00C0\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02ff\\u0370-\\u037d"
+ "\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff"
+ "\\uf900-\\ufdcf\\ufdf0-\\ufffd\\x10000-\\xEFFFF]"
+ "[:A-Z_a-z\\u00C0\\u00D6\\u00D8-\\u00F6"
+ "\\u00F8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c\\u200d\\u2070-\\u218f"
+ "\\u2c00-\\u2fef\\u3001-\\udfff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\-\\.0-9"
+ "\\u00b7\\u0300-\\u036f\\u203f-\\u2040]*\\Z";
return name.matches(re);
}

private static String escapingSpecialCharacters(String originStr) {
if (originStr == null) return null;
originStr = originStr.replace("&", "&amp;");
originStr = originStr.replace("<", "&lt;");
originStr = originStr.replace(">", "&gt;");
originStr = originStr.replace("\"", "&quot;");
originStr = originStr.replace("'", "&apos;");
return originStr;
}
}
2 changes: 2 additions & 0 deletions src/test/java/org/cloud/sonic/driver/poco/PocoDriverTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import org.cloud.sonic.driver.poco.enums.PocoEngine;
import org.cloud.sonic.driver.poco.enums.PocoSelector;
import org.cloud.sonic.driver.poco.models.PocoElement;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
Expand Down
Loading

0 comments on commit ce39803

Please sign in to comment.