@@ -158,22 +158,37 @@ private static CodeBlock generateToXmlCodeBlock(TypeElement classElement) throws
158158 codeBlock .endControlFlow ();
159159 }
160160 } else if (typeXmlKind == TypeXmlKind .LIST ) {
161+ TypeMirror genericListType = Util .getGenericTypeFromList (element );
162+ TypeElement genericListElement = ElementUtil .typeMirrorToTypeElement (genericListType );
163+
164+ boolean genericTypeIsBaseType = false ;
165+ if (genericListElement != null ) {
166+ TypeXmlKind genericTypeXmlKind = ElementUtil .getXmlKind (genericListElement );
167+ if (genericTypeXmlKind .isBaseType ()) {
168+ genericTypeIsBaseType = true ;
169+ }
170+ }
171+
161172 if (!Util .ignoreListNote (element )){
162173 codeBlock .addStatement (String .format ("xmlSerializer.startTag(\" \" , \" %s\" )" , Util .getElementName (element )));
163174 }
164- TypeMirror genericListType = Util .getGenericTypeFromList (element );
165- TypeElement genericListElement = ElementUtil .typeMirrorToTypeElement (genericListType );
166175
167176 codeBlock .beginControlFlow (String .format ("if (value.%s != null)" , element .getSimpleName ()))
168- .beginControlFlow (String .format ("for (int i =0; i<value.%s.size(); i++)" , element .getSimpleName ()))
169- .addStatement (String .format ("%s.toXml(xmlSerializer, value.%s.get(i), %s)" ,
170- ClassName .bestGuess ("com.tencent.qcloud.qcloudxml.core.QCloudXml" ),
171- element .getSimpleName (),
172- genericListElement != null
173- ? String .format ("\" %s\" " , Util .initialsUpperCase (Util .getTypeElementName (genericListElement )))
174- : null
175- ))
176- .endControlFlow ()
177+ .beginControlFlow (String .format ("for (int i =0; i<value.%s.size(); i++)" , element .getSimpleName ()));
178+ if (genericTypeIsBaseType ){
179+ codeBlock .addStatement (String .format ("xmlSerializer.startTag(\" \" , \" %s\" )" , Util .getElementName (element )))
180+ .addStatement (String .format ("xmlSerializer.text(String.valueOf(value.%s.get(i)))" , element .getSimpleName ()))
181+ .addStatement (String .format ("xmlSerializer.endTag(\" \" , \" %s\" )" , Util .getElementName (element )));
182+ } else {
183+ codeBlock .addStatement (String .format ("%s.toXml(xmlSerializer, value.%s.get(i), %s)" ,
184+ ClassName .bestGuess ("com.tencent.qcloud.qcloudxml.core.QCloudXml" ),
185+ element .getSimpleName (),
186+ genericListElement != null
187+ ? String .format ("\" %s\" " , Util .initialsUpperCase (Util .getTypeElementName (genericListElement )))
188+ : null
189+ ));
190+ }
191+ codeBlock .endControlFlow ()
177192 .endControlFlow ();
178193 if (!Util .ignoreListNote (element )){
179194 codeBlock .addStatement (String .format ("xmlSerializer.endTag(\" \" , \" %s\" )" , Util .getElementName ((element ))));
@@ -236,12 +251,20 @@ private static TypeSpec generateChildElementBinder(TypeElement classElement, Ele
236251 codeBlock .addStatement (String .format (generateBaseTypeAssignment (typeXmlKind ), element .getSimpleName ()));
237252 } else if (typeXmlKind == TypeXmlKind .LIST ) {
238253 TypeMirror genericListType = Util .getGenericTypeFromList (element );
254+ TypeElement genericListElement = ElementUtil .typeMirrorToTypeElement (genericListType );
255+
256+ boolean genericTypeIsBaseType = false ;
257+ if (genericListElement != null ) {
258+ TypeXmlKind genericTypeXmlKind = ElementUtil .getXmlKind (genericListElement );
259+ if (genericTypeXmlKind .isBaseType ()) {
260+ genericTypeIsBaseType = true ;
261+ }
262+ }
239263
240264 ParameterizedTypeName valueTypeAsArrayList = ParameterizedTypeName .get (ClassName .get (ArrayList .class ), ClassName .get (genericListType ));
241265 //两种list解析
242266 if (!Util .flatListNote (element )){
243- TypeElement genericListElement = ElementUtil .typeMirrorToTypeElement (genericListType );
244-
267+ // TODO: 2023/7/6 兼容响应中List的基础类型 比如string
245268 codeBlock .beginControlFlow (String .format ("if (value.%s == null)" , element .getSimpleName ()))
246269 .addStatement (String .format ("value.%s = new %s()" , element .getSimpleName (), valueTypeAsArrayList ))
247270 .endControlFlow ()
@@ -274,12 +297,34 @@ private static TypeSpec generateChildElementBinder(TypeElement classElement, Ele
274297 } else {
275298 codeBlock .beginControlFlow (String .format ("if (value.%s == null)" , element .getSimpleName ()))
276299 .addStatement (String .format ("value.%s = new %s()" , element .getSimpleName (), valueTypeAsArrayList ))
277- .endControlFlow ()
278- .addStatement (String .format ("value.%s.add(%s.fromXml(xmlPullParser, %s.class, \" %s\" ))" ,
279- element .getSimpleName (),
280- ClassName .bestGuess ("com.tencent.qcloud.qcloudxml.core.QCloudXml" ),
281- ClassName .get (genericListType ),
282- Util .initialsUpperCase (Util .getElementName (element ))));
300+ .endControlFlow ();
301+ if (genericTypeIsBaseType ){
302+ codeBlock .addStatement ("int eventType = xmlPullParser.getEventType()" )
303+ .beginControlFlow ("while (eventType != XmlPullParser.END_DOCUMENT)" )
304+ .beginControlFlow ("switch (eventType)" )
305+
306+ .beginControlFlow ("case XmlPullParser.START_TAG:" )
307+ .addStatement ("xmlPullParser.next()" )
308+ .addStatement (String .format (generateListBaseTypeAssignment (ElementUtil .getXmlKind (genericListElement )), element .getSimpleName ()))
309+ .endControlFlow ()
310+ .addStatement ("break" )
311+
312+ .beginControlFlow ("case XmlPullParser.END_TAG:" )
313+ .beginControlFlow (String .format ("if(\" %s\" .equalsIgnoreCase(xmlPullParser.getName()))" , Util .getElementName (element )))
314+ .addStatement ("return" )
315+ .endControlFlow ()
316+ .endControlFlow ()
317+
318+ .endControlFlow ()
319+ .addStatement ("eventType = xmlPullParser.next()" )
320+ .endControlFlow ();
321+ } else {
322+ codeBlock .addStatement (String .format ("value.%s.add(%s.fromXml(xmlPullParser, %s.class, \" %s\" ))" ,
323+ element .getSimpleName (),
324+ ClassName .bestGuess ("com.tencent.qcloud.qcloudxml.core.QCloudXml" ),
325+ ClassName .get (genericListType ),
326+ Util .initialsUpperCase (Util .getElementName (element ))));
327+ }
283328 }
284329 } else if (typeXmlKind == TypeXmlKind .NORMAL_BEAN ) {
285330 codeBlock .addStatement (String .format ("value.%s = %s.fromXml(xmlPullParser, %s.class, \" %s\" )" ,
@@ -311,6 +356,7 @@ private static TypeSpec generateChildElementBinder(TypeElement classElement, Ele
311356 /**
312357 * 生成基础类型赋值语句
313358 */
359+ // TODO: 2023/7/6 支持originalXmlString
314360 private static String generateBaseTypeAssignment (TypeXmlKind typeXmlKind ) {
315361 switch (typeXmlKind ) {
316362 case STRING :
@@ -334,4 +380,28 @@ private static String generateBaseTypeAssignment(TypeXmlKind typeXmlKind) {
334380 return "" ;
335381 }
336382 }
383+
384+ private static String generateListBaseTypeAssignment (TypeXmlKind typeXmlKind ) {
385+ switch (typeXmlKind ) {
386+ case STRING :
387+ case CHAR :
388+ return "value.%s.add(xmlPullParser.getText())" ;
389+ case INT :
390+ return "value.%s.add(Integer.parseInt(xmlPullParser.getText()))" ;
391+ case BYTE :
392+ return "value.%s.add(Byte.parseByte(xmlPullParser.getText()))" ;
393+ case LONG :
394+ return "value.%s.add(Long.parseLong(xmlPullParser.getText()))" ;
395+ case FLOAT :
396+ return "value.%s.add(Float.parseFloat(xmlPullParser.getText()))" ;
397+ case SHORT :
398+ return "value.%s.add(Short.parseShort(xmlPullParser.getText()))" ;
399+ case DOUBLE :
400+ return "value.%s.add(Double.parseDouble(xmlPullParser.getText()))" ;
401+ case BOOLEAN :
402+ return "value.%s.add(Boolean.parseBoolean(xmlPullParser.getText()))" ;
403+ default :
404+ return "" ;
405+ }
406+ }
337407}
0 commit comments