Chuyển đổi XML sang JSON (và trở lại) bằng Javascript


145

Làm thế nào bạn sẽ chuyển đổi từ XML sang JSON và sau đó trở lại XML?

Các công cụ sau hoạt động khá tốt, nhưng không hoàn toàn nhất quán:

Có ai gặp phải tình huống này trước đây?


8
Giải thích sự mâu thuẫn, làm ơn
Josh Stodola

4
Cụ thể, phải thực hiện với việc chuyển đổi các mảng JSON chỉ với 1 phần tử thành XML. Khi bạn chuyển đổi nó trở lại thành JSON, thay vì mảng 1 phần tử, nó đã tạo ra đối tượng theo nghĩa đen. Tôi đã làm việc xung quanh nó bằng cách kiểm tra kiểu với $ .isArray () và gói nó trong một mảng nếu! $. IsArray ().
Jason Suárez

1
xml2json - fyneworks.com/jquery/xml-to-json - phá vỡ 500 vào lúc 15/02/2013 14:25 AEST
ysrb

Liên kết json2xml bị hỏng.
lốc xoáy

@ysrb Ví dụ về plugin sẽ không hoạt động trong IE8!
anh chàng

Câu trả lời:


102

Tôi nghĩ đây là cách tốt nhất: Chuyển đổi giữa XML và JSON

Hãy chắc chắn đọc bài viết kèm theo trên trang web xml.com O'Reilly , trong đó đi sâu vào chi tiết về các vấn đề với các chuyển đổi này, mà tôi nghĩ bạn sẽ thấy giác ngộ. Việc O'Reilly đang lưu trữ bài báo sẽ chỉ ra rằng giải pháp của Stefan có giá trị.


Cảm ơn vi đa trả lơi! Trong trường hợp của tôi, JSON là biểu diễn chính tắc và XML chỉ được sử dụng cho XSLT .. việc sử dụng không phải là ý tưởng của tôi! :)
Jason Suárez

Điều này chỉ có trong trình duyệt. Không áp dụng cho node.js hoặc môi trường không có trình duyệt. Còn ý tưởng nào khác không?
Homer6

1
Liên quan đến bình luận của @JasonDenizac cho bài đăng của anh ấy, tôi không chắc chắn hiểu cách liên kết này giúp khắc phục vấn đề có một đối tượng thay vì một mảng của một mục ...
guiomie

1
Tôi thấy rằng nếu bạn bắt đầu từ json-xml-json, thư viện này hoạt động tốt, nhưng nếu bạn muốn xml-json-xml thì có vấn đề với tính thuận nghịch vì nó thêm các yếu tố xml siêu dữ liệu như <o> và <e>
vishr

3
Xin lưu ý rằng đây là một giải pháp được cấp phép copyleft. Nó chỉ là một tùy chọn khi bạn đang viết phần mềm nguồn mở.
Jasper

48

https://github.com/abdmob/x2js - thư viện của riêng tôi (URL được cập nhật từ http://code.google.com.vn/p/x2js/ ):

Thư viện này cung cấp XML sang JSON (Đối tượng JavaScript) và ngược lại các hàm chuyển đổi javascript. Thư viện rất nhỏ và không yêu cầu bất kỳ thư viện bổ sung nào khác.

Các hàm API

  • X2JS () mới - để tạo phiên bản của bạn để truy cập tất cả các chức năng của thư viện. Ngoài ra, bạn có thể chỉ định các tùy chọn cấu hình tùy chọn ở đây
  • X2JS.xml2json - Chuyển đổi XML được chỉ định làm Đối tượng DOM thành JSON
  • X2JS.json2xml - Chuyển đổi đối tượng JSON thành XML DOM
  • X2JS.xml_str2json - Chuyển đổi XML được chỉ định dưới dạng chuỗi thành JSON
  • X2JS.json2xml_str - Chuyển đổi chuỗi JSON thành XML

Bản demo trực tuyến trên 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
Xin chào, làm thế nào bạn khắc phục được vấn đề trong đó nếu bạn có một đối tượng trong một đối tượng thì nó nằm trong đối tượng rác, trong đó nếu có n> 1 đối tượng, bạn có một mảng. Điều này khiến cho việc sử dụng các đối tượng xml để json trong các mẫu trở nên khó khăn
guiomie

Có, bạn nên sử dụng một số mẹo và nó phụ thuộc vào kiến ​​thức của bạn về cấu trúc XML (vì không có XSD ở đây). Sử dụng cú pháp <node> ... <node> _asArray để truy cập nút của bạn luôn dưới dạng mảng (chuỗi)
abdolence

1
Ví dụ: // Chuỗi XML thành JSON var xmlText = "<MyOperation> <test> Thành công </ test> <test2> <item> ddsfg </ item> <item> dsdgfdgfd </ item> </ test2> </ MyOperation> "; var jsonObj = X2JS.xml_str2json (xmlText); cảnh báo (jsonObj.MyOperation.test); cảnh báo (jsonObj.MyOperation.test_asArray [0]);
thoái vị

Vấn đề chính của tôi, là khi tôi chuyển đổi json của mình thành xml trở lại, json có đầy đủ các thuộc tính bổ sung và khi phiên bản xml chuỗi giữ tất cả những thứ vô dụng. Nó có tất cả các loại dấu phẩy và khoảng trắng ...
guiomie

bạn có thể gửi mẫu của mình tới code.google.com/p/x2js/issues Tôi sẽ kiểm tra nó
abdolence

25

Những câu trả lời này đã giúp tôi rất nhiều để thực hiện chức năng này:

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);
  }
}

Miễn là bạn vượt qua trong một đối tượng jquery dom / xml: đối với tôi đó là:

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

trong đó nội dung là lĩnh vực tôi đang lưu trữ xml của mình.


3

Một thời gian trước tôi đã viết công cụ này https://bitbucket.org/surenrao/xml2json cho ứng dụng Danh sách theo dõi trên TV của tôi, hy vọng điều này cũng có ích.

Tóm tắt nội dung: Một thư viện không chỉ chuyển đổi xml thành json mà còn dễ dàng gỡ lỗi (không có lỗi hình tròn) và tạo lại json trở lại xml. Các tính năng: - Phân tích xml đối tượng json. In đối tượng json trở lại xml. Có thể được sử dụng để lưu xml trong IndexedDB dưới dạng đối tượng X2J. In đối tượng json.


@kleopatra liên kết này trỏ đến công cụ chuyển đổi xml thành json. Nó không phải là một tài liệu tham khảo mà là liên kết thực tế đến tài nguyên. Không biết làm thế nào khác tôi nên làm điều đó :)
surya

2

Cá nhân tôi muốn giới thiệu công cụ này . Nó là một trình chuyển đổi XML sang JSON.

Nó rất nhẹ và ở dạng JavaScript thuần túy. Nó không cần phụ thuộc. Bạn có thể chỉ cần thêm các chức năng vào mã của bạn và sử dụng nó như bạn muốn.

Nó cũng đưa các thuộc tính XML vào các cân nhắc.

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”}}’

Đây là một bản demo trực tuyến !


4
github repo không tìm thấy
brauliobo

1

Tuyên bố miễn trừ trách nhiệm: Tôi đã viết trình phân tích cú pháp nhanh xml

Trình phân tích cú pháp XML nhanh có thể giúp chuyển đổi XML sang JSON và ngược lại. Đây là ví dụ;

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);
}

Nếu bạn muốn phân tích đối tượng JSON hoặc JS thành XML thì

//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 không chỉ là trình chuyển đổi XML 2 XML. Vui lòng kiểm tra xem nó đã đọc.
Amit Kumar Gupta

1

Đây là một công cụ tốt từ thư viện npm được ghi lại và rất nổi tiếng, chuyển đổi xml <-> js rất tốt: khác với một số (có thể là tất cả) các giải pháp được đề xuất ở trên, nó cũng chuyển đổi các nhận xét xml.

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

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

1

Trong 6 dòng ES6 đơn giản:

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                                                                                                                                                              
}  

Kiểm tra với echo "xml2json_example()" | node -r xml2json.es6nguồn tại https://github.com/bAFiobo/biochemical-db/blob/master/lib/xml2json.es6


0

Tôi đã sử dụng xmlToJson chỉ để nhận một giá trị duy nhất của xml.
Tôi thấy việc thực hiện sau đây dễ dàng hơn nhiều (nếu xml chỉ xảy ra một lần ..)

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

Tôi đã tạo một hàm đệ quy dựa trên regex, trong trường hợp bạn không muốn cài đặt thư viện và hiểu logic đằng sau những gì đang xảy ra:

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;
}

Regex giải thích cho mỗi vòng lặp:

  • res [0] - trả lại xml (nguyên trạng)
  • res [1] - trả lại tên thẻ xml
  • res [2] - trả lại nội dung xml
  • res [3] - trả lại tên thẻ xml trong trường hợp thẻ tự đóng. Trong ví dụ:<tag />

Bạn có thể kiểm tra cách regex hoạt động tại đây: https://regex101.com/r/ZJpCAL/1

Lưu ý: Trong trường hợp json có khóa có giá trị không xác định, nó sẽ bị xóa. Đó là lý do tại sao tôi đã chèn null ở cuối dòng 9.


-2

Cách tốt nhất để làm điều đó bằng cách sử dụng phía máy chủ vì phía máy khách không hoạt động tốt trong tất cả các tình huống. Tôi đã cố gắng xây dựng trình chuyển đổi json trực tuyến sang xml và xml sang json bằng javascript và tôi cảm thấy gần như không thể vì nó không hoạt động trong tất cả các tình huống. Cuối cùng, tôi đã kết thúc việc thực hiện phía máy chủ bằng Newtonsoft trong ASP.MVC. Đây là công cụ chuyển đổi trực tuyến http://techfunda.com/Tools/XmlToJson

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.