Javascript를 사용하여 XML을 JSON으로 변환


145

XML에서 JSON으로 변환 한 다음 다시 XML로 어떻게 변환 하시겠습니까?

다음 도구는 잘 작동하지만 완전히 일치하지는 않습니다.

전에이 상황에 처한 사람이 있습니까?


8
불일치를 설명하십시오
Josh Stodola

4
특히, 요소가 하나 인 JSON 배열을 XML로 변환하는 것과 관련이있었습니다. 1 요소 배열 대신 JSON으로 다시 변환하면 객체 리터럴이 만들어졌습니다. $ .isArray ()로 유형을 확인하고! $. isArray ()이면 배열에 래핑하여 해결했습니다.
Jason Suárez

1
xml2json - fyneworks.com/jquery/xml-to-json - 나누기 15/02/2013 오스트레일리아 동부 표준시 14시 25분의 500 던졌습니다
ysrb

json2xml 링크가 끊어졌습니다.
whirlwin

@ysrb IE8에서는 플러그인 예제가 작동하지 않습니다!
친구

답변:


103

이것이 가장 좋은 방법이라고 생각합니다 .XML과 JSON 간 변환

xml.com O'Reilly 사이트 에서 첨부 된 기사 를 읽으십시오 . 여기에서 이러한 변환 관련 문제에 대해 자세히 알아볼 수 있습니다. O'Reilly가 기사를 호스팅하고 있다는 사실은 Stefan의 솔루션에 장점이 있음을 나타냅니다.


답장을 보내 주셔서 감사합니다! 필자의 경우 JSON은 정식 표현이며 XML은 XSLT에 사용됩니다. :)
Jason Suárez

이것은 브라우저에만 있습니다. node.js 또는 브라우저 이외의 환경에는 적용되지 않습니다. 다른 아이디어가 있습니까?
Homer6

1
그의 게시물에 대한 @JasonDenizac 의견과 관련하여,이 링크가 한 항목의 배열 대신 객체를 갖는 문제를 해결하는 데 어떻게 도움이되는지 잘 모르겠습니다 ...
guiomie

1
난 당신이 JSON-XML-JSON에서 시작하는 경우,이 라이브러리가 잘 작동 발견,하지만 당신은 XML-JSON - XML을 원하는 경우 메타 데이터 XML의 <O>와 <E>와 같은 요소를 추가하기 때문에 가역성에 문제가있는 것입니다
vishr

3
이것은 카피 레프트 라이센스 솔루션입니다. 오픈 소스 소프트웨어를 작성할 때만 옵션입니다.
재스퍼

48

https://github.com/abdmob/x2js- 내 라이브러리 ( http://code.google.com/p/x2js/ 에서 업데이트 된 URL ) :

이 라이브러리는 XML에서 JSON (JavaScript Objects)으로 또는 그 반대로 Javascript 변환 함수를 제공합니다. 라이브러리는 매우 작으며 다른 추가 라이브러리가 필요하지 않습니다.

API 함수

  • 새로운 X2JS ()-모든 라이브러리 기능에 액세스하기 위해 인스턴스를 작성합니다. 또한 여기에서 선택적 구성 옵션을 지정할 수 있습니다
  • X2JS.xml2json-DOM 오브젝트로 지정된 XML을 JSON으로 변환
  • X2JS.json2xml-JSON을 XML DOM 오브젝트로 변환
  • X2JS.xml_str2json-문자열로 지정된 XML을 JSON으로 변환
  • X2JS.json2xml_str-JSON을 XML 문자열로 변환

http://jsfiddle.net/abdmob/gkxucxrj/1/의 온라인 데모

var x2js = new X2JS();
function convertXml2JSon() {
    $("#jsonArea").val(JSON.stringify(x2js.xml_str2json($("#xmlArea").val())));
}

function convertJSon2XML() {
    $("#xmlArea").val(x2js.json2xml_str($.parseJSON($("#jsonArea").val())));
}

convertXml2JSon();
convertJSon2XML();
$("#convertToJsonBtn").click(convertXml2JSon);
$("#convertToXmlBtn").click(convertJSon2XML);

1
안녕하세요, 객체에 하나의 객체가있는 경우 객체가 객체 리터럴에 있고 n> 1 객체가있는 경우 배열이있는 문제를 어떻게 극복 했습니까? xml을 사용하여 템플릿의 객체를 json으로 만드는 것은 어렵습니다.
guiomie

그렇습니다. 트릭을 사용해야하며 XML 구조에 대한 지식에 달려 있습니다 (XSD가 없기 때문에). <node> ... <node> _asArray 구문을 사용하여 항상 배열 (순서)로 노드에 액세스하십시오
abdolence

1
JSON에 대한 Sample : // XML 문자열 var xmlText = "<MyOperation> <test> 성공 </ test> <test2> <item> ddsfg </ item> <item> dsdgfdgfd </ item> </ test2> </ MyOperation> "; var jsonObj = X2JS.xml_str2json (xmlText); 경고 (jsonObj.MyOperation.test); 경고 (jsonObj.MyOperation.test_asArray [0]);
Abdoence

내 주요 문제는 내 json을 xml로 다시 변환하고 json에 추가 속성이 가득 차고 문자열 xml 버전이 모든 쓸모없는 것을 유지하는 경우입니다. 여기에는 모든 종류의 쉼표와 공백이 있습니다.
guiomie

code.google.com/p/x2js/issues에 샘플을 제출할 수 있습니까 ? 확인해 보겠습니다.
abdolence

25

이 답변은이 기능을 수행하는 데 많은 도움이되었습니다.

function xml2json(xml) {
  try {
    var obj = {};
    if (xml.children.length > 0) {
      for (var i = 0; i < xml.children.length; i++) {
        var item = xml.children.item(i);
        var nodeName = item.nodeName;

        if (typeof (obj[nodeName]) == "undefined") {
          obj[nodeName] = xml2json(item);
        } else {
          if (typeof (obj[nodeName].push) == "undefined") {
            var old = obj[nodeName];

            obj[nodeName] = [];
            obj[nodeName].push(old);
          }
          obj[nodeName].push(xml2json(item));
        }
      }
    } else {
      obj = xml.textContent;
    }
    return obj;
  } catch (e) {
      console.log(e.message);
  }
}

jquery dom / xml 객체를 전달하는 한 다음과 같습니다.

Jquery(this).find('content').eq(0)[0]

여기서 내용은 내가 내 XML을 저장 한 분야이다.


3

얼마 전 나는 TV Watchlist 앱을 위해이 도구 https://bitbucket.org/surenrao/xml2json 을 썼습니다 . 이것이 도움이되기를 바랍니다.

Synopsys : xml을 json으로 변환 할뿐만 아니라 순환 오류없이 디버그하고 json을 xml로 다시 생성하는 라이브러리도 있습니다. 특징 :-XML을 json 객체로 구문 분석하십시오. json 객체를 xml로 다시 인쇄하십시오. IndexedDB에 xml을 X2J 객체로 저장하는 데 사용할 수 있습니다. JSON 객체를 인쇄하십시오.


@kleopatra이 링크는 xml을 json으로 변환하는 도구를 가리 킵니다. 참조가 아니라 리소스에 대한 실제 링크입니다. 내가 어떻게해야할지 모르겠다 :)
surya

2

개인적 으로이 도구를 추천 합니다 . XML to JSON 변환기입니다.

매우 가볍고 순수한 JavaScript입니다. 의존성이 필요하지 않습니다. 코드에 함수를 추가하고 원하는대로 사용할 수 있습니다.

또한 XML 속성을 고려합니다.

var xml = ‘<person id=”1234 age=”30”><name>John Doe</name></person>’;
var json = xml2json(xml); 

console.log(json); 
// prints ‘{“person”: {“id”: “1234”, “age”: “30”, “name”: “John Doe”}}’

여기 온라인 데모가 있습니다 !


4
github repo not found
brauliobo

1

면책 조항 : fast-xml-parser를 작성했습니다.

빠른 XML 파서는 XML을 JSON으로 또는 그 반대로 변환하는 데 도움이 될 수 있습니다. 예를 들면 다음과 같습니다.

var options = {
    attributeNamePrefix : "@_",
    attrNodeName: "attr", //default is 'false'
    textNodeName : "#text",
    ignoreAttributes : true,
    ignoreNameSpace : false,
    allowBooleanAttributes : false,
    parseNodeValue : true,
    parseAttributeValue : false,
    trimValues: true,
    decodeHTMLchar: false,
    cdataTagName: "__cdata", //default is 'false'
    cdataPositionChar: "\\c",
};
if(parser.validate(xmlData)=== true){//optional
    var jsonObj = parser.parse(xmlData,options);
}

JSON 또는 JS 객체를 XML로 구문 분석하려면

//default options need not to set
var defaultOptions = {
    attributeNamePrefix : "@_",
    attrNodeName: "@", //default is false
    textNodeName : "#text",
    ignoreAttributes : true,
    encodeHTMLchar: false,
    cdataTagName: "__cdata", //default is false
    cdataPositionChar: "\\c",
    format: false, 
    indentBy: "  ",
    supressEmptyNode: false
};
var parser = new parser.j2xParser(defaultOptions);
var xml = parser.parse(json_or_js_obj);

: D FXP는 XML 2 JSON 변환기 이상입니다. 읽어보기를 확인하십시오.
Amit Kumar Gupta

1

xml <-> js 변환을 매우 잘 수행하는 문서화되고 유명한 npm 라이브러리의 좋은 도구는 다음과 같습니다 . 위의 제안 된 솔루션 중 일부 (아마도)와 달리 xml 주석도 변환합니다.

var obj = {name: "Super", Surname: "Man", age: 23};

var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);

1

6 개의 간단한 ES6 라인에서 :

xml2json = xml => {                                                                                                                                                     
  var el = xml.nodeType === 9 ? xml.documentElement : xml                                                                                                               
  var h  = {name: el.nodeName}                                                                                                                                          
  h.content    = Array.from(el.childNodes || []).filter(e => e.nodeType === 3).map(e => e.textContent).join('').trim()                                                  
  h.attributes = Array.from(el.attributes || []).filter(a => a).reduce((h, a) => { h[a.name] = a.value; return h }, {})                                                 
  h.children   = Array.from(el.childNodes || []).filter(e => e.nodeType === 1).map(c => h[c.nodeName] = xml2json(c))                                                    
  return h                                                                                                                                                              
}  

https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6echo "xml2json_example()" | node -r xml2json.es6 에서 소스로 테스트 하십시오.


0

xmlToJson을 사용하여 XML의 단일 값을 얻었습니다.
다음 작업을 수행하는 것이 훨씬 쉽다는 것을 알았습니다 (xml이 한 번만 발생하는 경우.)

let xml =
'<person>' +
  ' <id>762384324</id>' +
  ' <firstname>Hank</firstname> ' +
  ' <lastname>Stone</lastname>' +
'</person>';

let getXmlValue = function(str, key) {
  return str.substring(
    str.lastIndexOf('<' + key + '>') + ('<' + key + '>').length,
    str.lastIndexOf('</' + key + '>')
  );
}


alert(getXmlValue(xml, 'firstname')); // gives back Hank


0

라이브러리를 설치하고 무슨 일이 일어나고 있는지에 대한 논리를 이해하고 싶지 않은 경우 정규식을 기반으로 재귀 함수를 만들었습니다.

const xmlSample = '<tag>tag content</tag><tag2>another content</tag2><tag3><insideTag>inside content</insideTag><emptyTag /></tag3>';
console.log(parseXmlToJson(xmlSample));

function parseXmlToJson(xml) {
    const json = {};
    for (const res of xml.matchAll(/(?:<(\w*)(?:\s[^>]*)*>)((?:(?!<\1).)*)(?:<\/\1>)|<(\w*)(?:\s*)*\/>/gm)) {
        const key = res[1] || res[3];
        const value = res[2] && parseXmlToJson(res[2]);
        json[key] = ((value && Object.keys(value).length) ? value : res[2]) || null;

    }
    return json;
}

각 루프에 대한 정규식 설명 :

  • res [0]-XML을있는 그대로 반환
  • res [1]-XML 태그 이름을 반환
  • res [2]-XML 내용을 반환
  • res [3]-태그가 닫히는 경우 XML 태그 이름을 반환합니다. 예를 들면 다음과 같습니다.<tag />

정규식이 어떻게 작동하는지 확인할 수 있습니다. https://regex101.com/r/ZJpCAL/1

참고 : json에 정의되지 않은 값의 키가있는 경우 제거됩니다. 이것이 9 행의 끝에 null을 삽입 한 이유입니다.


-2

서버 측을 클라이언트 측으로 사용하는 가장 좋은 방법은 모든 시나리오에서 제대로 작동하지 않습니다. 자바 스크립트를 사용하여 온라인 json to xml 및 xml to json 변환기를 작성하려고했지만 모든 시나리오에서 작동하지 않기 때문에 거의 불가능하다고 느꼈습니다. 궁극적으로 ASP.MVC에서 Newtonsoft를 사용하여 서버 측에서 작업했습니다. 다음은 온라인 변환기 http://techfunda.com/Tools/XmlToJson입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.