XML 파일 을 JSon 문자열 로 변환 하 는 방법

4716 단어 상용 방법
xml 에서 json 으로 전환 할 때 이론 적 으로 모든 xml 파일 을 변환 할 수 있 습 니 다.다른 블 로 거들 이 쓴 코드 가 좋 은 것 을 많이 보 았 지만 프로그램의 사고방식 이 무엇 인지 정확히 쓰 지 못 했 습 니 다. 마침 최근 에 이 부분 을 사용 해서 연 구 를 했 는데 xml 라벨 의 속성 을 얻 는 방법 을 추 가 했 습 니 다.이제 전환 의 사 고 를 정리 해서 나중에 빨리 주 울 수 있 도록 하 겠 습 니 다. 필요 한 사람 을 도 울 수 있다 면 기 쁘 고 부족 한 점 은 다시 보충 할 생각 입 니 다.
사용 한 jar 패키지:
    jdom ,fastjson(alibaba)
전환 방향:
    절 차 는 다음 과 같다.
    1. xml 파일 을 문자열 로 변환 합 니 다. xml 파일 을 읽 어서 가 져 오고 Decument 으로 변환 할 수 있 습 니 다.Decument 을 변환 할 때 xml 파일 을 스 트림 형식 으로 변환 하고 인 코딩 방식 은 utf - 8 로 중국어 의 난 장 판 을 방지 해 야 합 니 다.
    2. Decument 방법 을 사용 하여 루트 노드 를 가 져 오고 노드 안의 모든 하위 노드 를 옮 겨 다 니 며 각 노드 를 JSonobject 로 변환 합 니 다.
    3. 시간 이 지나 면 노드 의 속성 과 노드 아래 의 하위 노드 는 같은 등급 에 있 고 속성 은 앞 에 있 으 며 하위 노드 는 뒤에 있다.여러 속성 이나 하위 노드 가 있 으 면 하나의 list 로 포장 하고 가장 바깥쪽 에 있 는 JSONobject 에 넣 습 니 다.
    탭 을 옮 겨 다 니 는 방법:
    1. 순환 을 한 번 설정 하고 순환 하 는 횟수 는 뿌리 노드 의 다음 노드 의 개수 입 니 다.
    2. 현재 노드 에 속성 값 이 포함 되 어 있 는 지 판단 합 니 다. 포함 되 어 있 으 면 속성 값 을 모두 꺼 내 list 에 넣 고 이 list 를 옮 겨 다 니 며 속성의 이름과 값 을 꺼 내 JSONobject 에 넣 고 마지막 으로 list 에 넣 습 니 다.하나의 원소 속성 값 과 그의 하위 원소 의 값 은 같은 등급 이다.
    3. 현재 요소 에 다른 하위 요소 가 있 는 지 판단 합 니 다. 현재 요 소 를 루트 요소 로 재 귀적 으로 옮 겨 다 니 는 방법 이 있 으 면.
    4. JSONobject 에 노드 의 속성 을 추가 한 다음 에 이 노드 의 하위 노드 를 추가 할 때 이전의 노드 를 선택 하여 확대 해 야 한다.
자바 코드 는 다음 과 같 습 니 다:
public class JsonParse2 {
	public static String xml2JSON(String xml) {
		
		JSONObject json = new JSONObject();
		byte[] byteStream = null;
		try {
			byteStream = xml.getBytes("utf-8");
		} catch (UnsupportedEncodingException e1) {

			e1.printStackTrace();
		}
		InputStream is = new ByteArrayInputStream(byteStream);
		SAXBuilder sb = new SAXBuilder();
		org.jdom.Document doc = null;
		try {
			doc = sb.build(is);
		} catch (JDOMException | IOException e) {

			e.printStackTrace();
		}
		Element root = doc.getRootElement();
		json.put(root.getName(), iterateElement(root));
		String jsonString = json.toJSONString();
		return jsonString;
	}

	private static JSONObject iterateElement(Element element) {
		List node = element.getChildren();
		Element et = null;
		JSONObject obj = new JSONObject();
		//           ,      list,     
		List list = null;
		//      
		for (int i = 0; i < node.size(); i++) {
			
            list = new LinkedList<>();
            et = (Element) node.get(i);
            
            //        
            if (et.getAttributes().size() > 0) {
            	//             
    			List attributes = et.getAttributes();
    			//         jsonobject
    			JSONObject attrvalue = new JSONObject();
    			//         list
    			List attrvalues = new ArrayList<>();
    			for (Attribute attr : attributes) {
    				//            jsonobject
    				attrvalue.put(attr.getName(),attr.getValue());
    				
    			}
    			
    			attrvalues.add(attrvalue);
    			obj.put(et.getName(), attrvalues);
    		}
            //        
            if (et.getTextTrim().equals("")) {
                if (et.getChildren().size() == 0)
                    continue;
                //  obj              
                if (obj.containsKey(et.getName())) {
                	//   ,     list   
                    list = (List) obj.get(et.getName());
                }
                list.add(iterateElement(et));
                obj.put(et.getName(), list);
            } else {
                 if (obj.containsKey(et.getName())) {
                    list = (List) obj.get(et.getName());
                }
                
                list.add(et.getTextTrim());
                obj.put(et.getName(), list);
            }
        }
		
		return obj;
	}
}

테스트 용례:

	
		
			
				202138621209
				1234
				+8612341234
			
		
	


테스트 결과:
{
	"Envelope": {
		"Body": [{
			"PlaceOrder_LocalInput": [{
				"PlaceOrder_LocalInput": [{
					"loid": "111"
				}, {
					"AccountNum": ["202138621209"],
					"ContactPhone": ["+8612341234"],
					"ContactId": ["1234"]
				}]
			}]
		}]
	}
}

좋은 웹페이지 즐겨찾기