programing

XML에서 JavaScript 개체로

showcode 2023. 3. 16. 22:03
반응형

XML에서 JavaScript 개체로

XML 문자열을 해석하여 JavaScript 객체로 변환하는 JavaScript 라이브러리를 찾고 있습니다.좋은 게 뭐가 있을까요?

다음 함수는 XML을 해석하고 XML에 대응하는 스킴을 가진 JavaScript 객체를 반환합니다.같은 이름을 가진 XML 형제자매는 배열로 정리됩니다.에서 찾을 수 있는 이름을 가진 노드arrayTags매개 변수(태그 이름 문자열 배열)는 태그가 하나만 발생한 경우에도 항상 배열을 생성합니다. arrayTags생략할 수 있습니다.공백만 있는 텍스트노드는 폐기됩니다.

function parseXml(xml, arrayTags) {
    let dom = null;
    if (window.DOMParser) dom = (new DOMParser()).parseFromString(xml, "text/xml");
    else if (window.ActiveXObject) {
        dom = new ActiveXObject('Microsoft.XMLDOM');
        dom.async = false;
        if (!dom.loadXML(xml)) throw dom.parseError.reason + " " + dom.parseError.srcText;
    }
    else throw new Error("cannot parse xml string!");

    function parseNode(xmlNode, result) {
        if (xmlNode.nodeName == "#text") {
            let v = xmlNode.nodeValue;
            if (v.trim()) result['#text'] = v;
            return;
        }

        let jsonNode = {},
            existing = result[xmlNode.nodeName];
        if (existing) {
            if (!Array.isArray(existing)) result[xmlNode.nodeName] = [existing, jsonNode];
            else result[xmlNode.nodeName].push(jsonNode);
        }
        else {
            if (arrayTags && arrayTags.indexOf(xmlNode.nodeName) != -1) result[xmlNode.nodeName] = [jsonNode];
            else result[xmlNode.nodeName] = jsonNode;
        }

        if (xmlNode.attributes) for (let attribute of xmlNode.attributes) jsonNode[attribute.nodeName] = attribute.nodeValue;

        for (let node of xmlNode.childNodes) parseNode(node, jsonNode);
    }

    let result = {};
    for (let node of dom.childNodes) parseNode(node, result);

    return result;
}

다음은 xml2json 및 json2xml 변환기입니다.

여기 또 있습니다.

필요에 따라 표준 파서를 사용할 수 있습니다(http://www.w3schools.com/XML/tryit.asp?filename=tryxml_parsertest2) 및 xpath(http://www.w3schools.com/xpath/default.asp) 참조). 예를 들어 다음과 같습니다.

좋은 튜토리얼이 몇 가지 있습니다.

바로 점으로 이동(node-xml2json 사용):

npm install xml2json

다음으로 사용합니다.

const parser = require('xml2json');

const obj = parser.toJson(xml, { object: true });

예:

const parser = require('xml2json');

const xml = '<root><person><name>Bob Dylan</name></person></root>';

const obj = parser.toJson(xml, { object: true });
const { person } = obj.root;
person.name; // Bob Dylan

JSON에서 XML 등으로 변환할 수도 있습니다.

추가 #text 객체를 생성하지 않고 속성을 무시한 단순한 Typescript 버전을 원했습니다.이것이 필요한 경우, 코드는 다음과 같습니다.

export class DomFuncs {

    static parseNode = (node: Node) => {    
        const childNodes = node.childNodes;
        if (childNodes.length === 0) {
            return node.nodeValue;
        } else if (childNodes.length === 1 && childNodes[0].nodeType === Node.TEXT_NODE) {
            return childNodes[0].nodeValue;
        } else {
            const obj = {};
            childNodes.forEach(childNode => {
                const childName = childNode.nodeName;
                const childValue = obj[childName];
                if (childValue !== undefined) {
                    if (Array.isArray(childValue)) {
                        childValue.push(DomFuncs.parseNode(childNode));
                    } else {
                        obj[childName] = [childValue, DomFuncs.parseNode(childNode)];
                    }
                } else {
                    obj[childName] = DomFuncs.parseNode(childNode);
                }
            });
            return obj;
        }
    };

    static xml2obj = (str: string) => {
        const dom = (new DOMParser()).parseFromString(str, 'text/xml')
        const result = {[dom.nodeName]: DomFuncs.parseNode(dom)};
        return result;
    }
}

사용방법:

DomFuncs.xml2obj(xmlString);

변환된 개체에 XML 속성이 필요하지 않으므로 현재 이 스크립트는 XML 속성을 무시합니다.그게 필요하면 알려주시면 코드를 업데이트 해드릴게요.

https://bitbucket.org/surenrao/xml2json의 xml2json javascript 파일만 있으면 됩니다.

다운로드 링크(https://bitbucket.org/surenrao/xml2json/get/0e0989dfe48e.zip)는 다음과 같습니다.

프로젝트에 포함되면 시작할 수 있는 샘플 코드를 몇 가지 소개합니다.

var xmlStr = "<root><person><name>Bob Dylan</name></person></root>";
var jsObj = X2J.parseXml(xmlStr);
var result = jsObj[0].root[0].person[0].name[0].jValue; //Bob Dylan

언급URL : https://stackoverflow.com/questions/4200913/xml-to-javascript-object

반응형