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://goessner.net/download/prj/jsonxml/
- 관련 튜토리얼 : http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html
여기 또 있습니다.
필요에 따라 표준 파서를 사용할 수 있습니다(http://www.w3schools.com/XML/tryit.asp?filename=tryxml_parsertest2) 및 xpath(http://www.w3schools.com/xpath/default.asp) 참조). 예를 들어 다음과 같습니다.
좋은 튜토리얼이 몇 가지 있습니다.
- http://www.nczonline.net/blog/2009/03/17/xpath-in-javascript-part-1/
- https://developer.mozilla.org/en/introduction_to_using_xpath_in_javascript
바로 점으로 이동(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
'programing' 카테고리의 다른 글
PL/SQL Oracle 함수 또는 절차 작성을 위한 IS vs AS 키워드 (0) | 2023.03.16 |
---|---|
JSON 파일을 Spark로 읽을 때 _corrupt_record 오류가 발생함 (0) | 2023.03.16 |
워드프레스에서 별도로 관리하는 두 메뉴를 하나로 통합하여 프런트 엔드 테마에 표시하는 방법은 무엇입니까? (0) | 2023.03.16 |
react-intl vs react-i18(React용)JS 국제화(i18n) (0) | 2023.03.16 |
레스트렛, CLAP, Ajax 및 청크 타임아웃 (0) | 2023.03.16 |