JavaScript XML 과 JSON 의 상호 전환 코드 구현
25787 단어 JavaScript
최근 온라인 XML 편집기 개발 중 이 며 JSON 을 중간 포맷 으로 사용 할 계획 이다.JSON 은 XML 에 비해 읽 기 쉽 고 해석 속도 가 빠 르 며 점용 공간 이 적 다 는 장점 이 있어 WEB 에서 데 이 터 를 전달 하기 쉽 기 때문이다.그러나 실제 사용 에서 무시 하기 쉬 운 세부 사항 을 발 견 했 고 XML 의 원시 구 조 를 엄 격 히 확보 해 야 하 는 경우 JSON 으로 전환 할 때 주의 가 필요 하 다.
XML 을 JSON 으로 변환 하 는 형식 은 다음 과 같 습 니 다.
//XML
<article>
<header id="h1"> </header>
<section id="s1">
<header> </header>
<p> </p>
</section>
</article>
//JSON
{
"article": {
"header": {
"#text": " ",
"@id": "h1"
},
"section": {
"@id": "s1",
"header": " ",
"p": " "
}
}
}
Js 로 XML 을 JSON 의 스 크 립 트 로 바 꾸 고 인터넷 에서 기 존의 스 크 립 트 를 찾 았 지만 대부분 간단 한 상황 만 만족 시 키 고 원시 구조의 상호 전환 을 보장 할 수 없 었 다.다음은 인터넷 에서 찾 은 스 크 립 트 나 글 입 니 다.
x2js : https://code.google.com/p/x2js/
jsonxml : http://davidwalsh.name/convert-xml-json
JKL.ParseXML : http://www.kawa.net/works/js/jkl/parsexml-e.html
x2js 는 아래 XML 을 정확하게 복원 하지 않 습 니 다.
//XML
<p> <strong> </strong> <em> </em> </p>
두 번 째 스 크 립 트 jsonxml 는 위 에 있 는 '텍스트 혼합 탭' 의 경우 탭 을 추출 하지 않 고 아래 형식 으로 변환 합 니 다.
{"p":"<strong> </strong> <em> </em>"}}
그 후에 나 는 다음 과 같은 형식 으로 해석 한 후에 '텍스트 혼합 태그' 가 정확하게 복원 할 수 있 는 상황 을 만족 시 켰 다.
{"p":[{"strong":" "}," ",{"em":" "}]}
또한 아래 코드 와 같이 위 에서 언급 한 스 크 립 트 를 사용 하여 변환 하면 복원 할 수 없 는 상황 을 초래 할 수 있 습 니 다.
<article>
<section id="s1"> </section>
<header id="h1"> </header>
<section id="s2"> </section>
</article>
마찬가지 로 한 탭 에 하위 탭 이 한 번 이상 나 타 났 습 니 다. 데 이 터 를 기록 할 경로 가 필요 하 다 면 배열 로 이 구 조 를 저장 해 야 합 니 다.정확 한 코드 는:
{
"article": [ {
"section": {
"#text": " ",
"@id": "s1"
},
}, {
"header": {
"#text": " ",
"@id": "h1"
}
}, {
"section": {
"#text": " ",
"@id": "s2"
}
}
]
}
jkl.parsexml
SAMPLE XML SOURCE: XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
<item>
<zip_cd>10036</zip_cd>
<us_state>NY</us_state>
<us_city>New York</us_city>
<us_dist>Broadway</us_dist>
</item>
</items>
SAMPLE SCRIPT:
<script type="text/javascript" src="jkl-parsexml.js"></script>
<script><!--
var url = "zip-e.xml";
var xml = new JKL.ParseXML( url );
var data = xml.parse();
document.write( data["items"]["item"]["us_state"] );
document.write( data.items.item.us_state );
// --></script>
OUTPUT JSON:
{
items: {
item: {
zip_cd: "1000001"
us_state: "NY",
us_city: "New York",
us_dist: "Broadway",
}
}
};
jsonxml
// Changes XML to JSON
function xmlToJson(xml) {
// Create the return object
var obj = {};
if (xml.nodeType == 1) { // element
// do attributes
if (xml.attributes.length > 0) {
obj["@attributes"] = {};
for (var j = 0; j < xml.attributes.length; j++) {
var attribute = xml.attributes.item(j);
obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
}
}
} else if (xml.nodeType == 3) { // text
obj = xml.nodeValue;
}
// do children
if (xml.hasChildNodes()) {
for(var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName;
if (typeof(obj[nodeName]) == "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
if (typeof(obj[nodeName].push) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(xmlToJson(item));
}
}
}
return obj;
};
The major change I needed to implement was using attributes.item(j) instead of the attributes[j] that most of the scripts I found used. With this function, XML that looks like:
<ALEXA VER="0.9" URL="davidwalsh.name/" HOME="0" AID="=">
<SD TITLE="A" FLAGS="" HOST="davidwalsh.name">
<TITLE TEXT="David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else"/>
<LINKSIN NUM="1102"/>
<SPEED TEXT="1421" PCT="51"/>
</SD>
<SD>
<POPULARITY URL="davidwalsh.name/" TEXT="7131"/>
<REACH RANK="5952"/>
<RANK DELTA="-1648"/>
</SD>
</ALEXA>
...becomes workable a JavaScript object with the following structure:
{
"@attributes": {
AID: "=",
HOME: 0,
URL: "davidwalsh.name/",
VER: "0.9",
},
SD = [
{
"@attributes": {
FLAGS: "",
HOST: "davidwalsh.name",
TITLE: A
},
LINKSIN: {
"@attributes": {
NUM: 1102
}
},
SPEED: {
"@attributes": {
PCT: 51,
TEXT: 1421
}
},
TITLE: {
"@attributes": {
TEXT: "David Walsh Blog :: PHP, MySQL, CSS, Javascript, MooTools, and Everything Else",
}
},
},
{
POPULARITY: {
"@attributes": {
TEXT: 7131,
URL: "davidwalsh.name/"
}
},
RANK: {
"@attributes": {
DELTA: "-1648"
}
},
REACH: {
"@attributes": {
RANK = 5952
}
}
}
]
}
한참 동안 말 했 는데 다음 에 예 하 나 를 정리 하 였 다.
function xmlToJson(xml) {
// Create the return object
var obj = {};
if (xml.nodeType == 1) { // element
// do attributes
if (xml.attributes.length > 0) {
obj["@attributes"] = {};
for (var j = 0; j < xml.attributes.length; j++) {
var attribute = xml.attributes.item(j);
obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
}
}
} else if (xml.nodeType == 3) { // text
obj = xml.nodeValue;
}
// do children
if (xml.hasChildNodes()) {
for (var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName;
if (typeof (obj[nodeName]) == "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
if (typeof (obj[nodeName].length) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(xmlToJson(item));
}
}
}
return obj;
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.