Skip to content

Commit 72e0f04

Browse files
committed
Support format xml for EasyFormatter
1 parent dc56f86 commit 72e0f04

File tree

3 files changed

+70
-52
lines changed

3 files changed

+70
-52
lines changed

app/src/main/java/com/haoge/sample/easyandroid/activities/EasyFormaterActivity.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ class EasyFormaterActivity: BaseActivity() {
103103
mResult.text = result
104104
}
105105

106+
@OnClick(R.id.formatXml)
107+
fun formatXml() {
108+
val xml = "<resources><string name=\"app_name\">utils</string>\n</resources>"
109+
mResult.text = mUsedFormatter.format(xml)
110+
}
111+
106112
fun escape(source:String):String {
107113
val chars = source.toCharArray()
108114
for (value in chars) {

app/src/main/res/layout/activity_formater.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@
7878
android:layout_width="match_parent"
7979
android:layout_height="wrap_content" />
8080

81+
<Button
82+
android:id="@+id/formatXml"
83+
android:text="格式化xml"
84+
android:layout_width="match_parent"
85+
android:layout_height="wrap_content" />
8186

8287
</LinearLayout>
8388

utils/src/main/java/com/haoge/easyandroid/easy/EasyFormatter.kt

Lines changed: 59 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@ package com.haoge.easyandroid.easy
33
import android.util.Log
44
import org.json.JSONArray
55
import org.json.JSONObject
6+
import java.io.StringReader
7+
import java.io.StringWriter
68
import java.lang.reflect.Modifier
79
import java.util.*
8-
import java.util.regex.Pattern
10+
import javax.xml.transform.OutputKeys
11+
import javax.xml.transform.TransformerException
12+
import javax.xml.transform.TransformerFactory
13+
import javax.xml.transform.stream.StreamResult
14+
import javax.xml.transform.stream.StreamSource
915

1016
/**
1117
* 对数据进行格式化
@@ -14,6 +20,7 @@ import java.util.regex.Pattern
1420
*/
1521
class EasyFormatter private constructor(private val builder: Builder) {
1622

23+
private val indent = " "
1724
private val list = mutableListOf<Any>()// 用于临时存放当前已被解析的类。防止出现循环引用导致栈溢出
1825
// 格式化List/Set集合数据
1926
private fun formatCollection(collection: Collection<*>): StringBuilder {
@@ -40,71 +47,71 @@ class EasyFormatter private constructor(private val builder: Builder) {
4047
} else if (data.startsWith("[")
4148
&& data.endsWith("]")) {
4249
return formatJSONArray(data)
50+
} else if (data.startsWith("<")
51+
&& data.endsWith(">")) {
52+
return formatXML(data)
4353
}
4454

4555
return StringBuilder(data)
4656
}
4757

58+
private fun formatXML(data:String):StringBuilder {
59+
return try {
60+
val xmlInput = StreamSource(StringReader(data))
61+
val xmlOutput = StreamResult(StringWriter())
62+
val transformer = TransformerFactory.newInstance().newTransformer()
63+
transformer.setOutputProperty(OutputKeys.INDENT, "yes")
64+
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2")
65+
transformer.transform(xmlInput, xmlOutput)
66+
val output = xmlOutput.writer.toString().replaceFirst(">".toRegex(), ">\n")
67+
val lines = output.lines()
68+
val isFlat = isFlat(builder.maxMapSize, lines.size)
69+
val result = StringBuilder()
70+
if (isFlat.not()) {
71+
result.append(output)
72+
} else {
73+
lines.forEach { result.append(it.trimIndent()) }
74+
}
75+
result
76+
} catch (e: TransformerException) {
77+
StringBuilder(data)
78+
}
79+
}
80+
4881
private fun formatJSONArray(data: String): StringBuilder {
49-
val result = StringBuilder("[")
50-
try {
51-
val array = JSONArray(data)
52-
val length = array.length()
53-
val isFlat = isFlat(builder.maxArraySize, length)
54-
55-
for (index in 0..(length - 1)) {
56-
val sub = StringBuilder()
57-
if (!isFlat) {
58-
result.append("\n")
59-
}
82+
return try {
83+
val json = JSONArray(data).toString(indent.length)
6084

61-
sub.append(formatString(array.optString(index)))
62-
if (index != length - 1) {
63-
sub.append(",")
64-
}
65-
appendSubString(result, sub, isFlat)
66-
}
67-
if (!isFlat) {
68-
result.append("\n")
85+
val lines = JSONArray(data).toString(indent.length).lines()
86+
val isFlat = isFlat(builder.maxMapSize, lines.size)
87+
val result = StringBuilder()
88+
if (isFlat.not()) {
89+
result.append(json)
90+
} else {
91+
lines.forEach { result.append(it.trimIndent()) }
6992
}
93+
result
7094
} catch (e:Exception) {
71-
return StringBuilder(data)
95+
StringBuilder(data)
7296
}
73-
result.append("]")
74-
return result
7597
}
7698

7799
private fun formatJSONObject(data: String): StringBuilder {
78-
val result = StringBuilder("{")
79-
try {
80-
val json = JSONObject(data)
81-
val length = json.length()
82-
val keys = json.keys()
83-
val isFlat = isFlat(builder.maxMapSize, length)
84-
var hasNext = keys.hasNext()
85-
while (hasNext) {
86-
if (!isFlat) {
87-
result.append("\n")
88-
}
89-
90-
val sub = StringBuilder()
91-
val next = keys.next()
92-
sub.append(formatString(next)).append(":").append(json.optString(next))
100+
return try {
101+
val json = JSONObject(data).toString(indent.length)
93102

94-
hasNext = keys.hasNext()
95-
if (hasNext) {
96-
sub.append(", ")
97-
}
98-
appendSubString(result, sub, isFlat)
99-
}
100-
if (!isFlat) {
101-
result.append("\n")
103+
val lines = JSONArray(data).toString(indent.length).lines()
104+
val isFlat = isFlat(builder.maxMapSize, lines.size)
105+
val result = StringBuilder()
106+
if (isFlat.not()) {
107+
result.append(json)
108+
} else {
109+
lines.forEach { result.append(it.trimIndent()) }
102110
}
111+
result
103112
} catch (e:Exception) {
104-
return StringBuilder(data)
113+
StringBuilder(data)
105114
}
106-
result.append("}")
107-
return result
108115
}
109116

110117
private fun isFlat(maxSize:Int, length:Int):Boolean {
@@ -152,7 +159,7 @@ class EasyFormatter private constructor(private val builder: Builder) {
152159
result.append(value)
153160
result.append("\n")
154161
} else {
155-
result.append(value.replace(Pattern.compile("(\t)").toRegex(), ""))
162+
result.append(value.trimIndent())
156163
}
157164
}
158165
result.toString()
@@ -208,11 +215,11 @@ class EasyFormatter private constructor(private val builder: Builder) {
208215
val lines = subString.lines()
209216
for ((index, value) in lines.withIndex()) {
210217
if (index == 0) {
211-
if (!isFlat) container.append("\t")
218+
if (!isFlat) container.append(indent)
212219
container.append(value)
213220
if (lines.size > 1) container.append("\n")
214221
} else if (value.isNotEmpty()) {
215-
container.append("\t").append(value)
222+
container.append(indent).append(value)
216223
.append(if (index == lines.size - 1) "" else "\n")
217224
}
218225
}

0 commit comments

Comments
 (0)