在Node.js中,xmldom 包的实现非常类似于PHP DOM API。都是为了创建一个DOMDocument对象,通过childNodes属性获得节点的值。
为了使用xmldom,需要安装相应的npm包
npm install xmldom
与PHP不同的是,Node的xmldom首先创建的是DOMParser对象,然后调用parseFromString()获得DOMDocument对象,而不是像PHP一样修改空的DOMDocument对象获得XML对象。
//PHP
$dom = new DOMDocument();
$dom -> loadXML('./*.xml');
//Node
var domParser = require('xmldom').DOMParser;
var xml_domparser = new domParser();
var xml_dom = xml_domparser.parseFromString(data,'text/xml');
在对DOM对象的操作,不管是哪种语言(java、C、C++……),都是通过遍历DOMDocument对象的childNodes属性,以及孩子节点的childNodes属性。
var fs = require('fs');
var domParser = require('xmldom').DOMParser;
var xml_domparser = new domParser();
fs.readFile(__dirname+'/'+'save.xml','utf-8',function(error,data){
if(!error){
// console.log(data);
node_xml(data);
}
});
function node_xml(data){
var xml_dom = xml_domparser.parseFromString(data,'text/xml');
// console.log('succ');
for(var cc=0; xml_dom.childNodes && (cc<xml_dom.childNodes.length); cc++){
var parent = xml_dom.childNodes[cc];
// console.log(parent.tagName+'-'+cc);
if(parent.tagName && (parent.tagName == 'books')){
for(var c=0; c<parent.childNodes.length; c++){
var tag = parent.childNodes[c];
if(tag.tagName){
console.log(tag.tagName);
console.log(tag.childNodes[1].nodeValue);
if(tag.attributes){
for(var a=0; a<tag.attributes.length; a++){
console.log(tag.attributes[a].name+": "+tag.attributes[a].value);
}
}
}
}
}
}
}
//save.xml
<?xml version="1.0" encoding="utf-8"?>
<books>
<book type="web">
<name>php</name>
</book>
<book type="web">
<name>java</name>
</book>
<book type="client">
<name>html</name>
</book>
</books>
在Node.js中生成一个XML字符串,跟PHP一样,可以简单地通过连接操作符进行字符串的拼接。
var xml = '';
xml+= '<?xml version="1.0"?>';
xml+= '<book>'+'\n';
xml+= '<name value="node_xml"/>'+'\n';
xml+= '<publish value="web"/>'+'\n';
xml+= '<author value="bee"/>'+'\n';
xml+= '</book>';
console.log(xml);
PHP另外一种复杂的创建XML数据的方式是使用XMLWriter类,Node.js与之对应的是xml-writer。要使用该方式同样需要安装相应的npm包。
npm install xml-writer
var xml_writer = require('xml-writer');
var xml = new xml_writer();
xml.startDocument('1.0');
xml.startElement('book');
xml.startElement('name');
xml.writeAttribute('value','node_xml');
xml.endElement();
xml.startElement('publish');
xml.writeAttribute('value','web');
xml.endElement();
xml.startElement('author');
xml.writeAttribute('value','bee');
xml.endElement();
xml.endElement();
xml.endDocument();
var dom = xml.toString();
console.log(dom);
与PHP SimpleXML对XML操作转换为数组对象相比,较类似的是Node.js的xmlreader,可以将XML转换为相应的JSON对象,同样要使用xmlreader,需要安装相应的npm包。
npm install xmlreader
var xml_reader = require("xmlreader");
var xml_writer = require('xml-writer');
var xml = new xml_writer();
xml.startDocument('1.0');
xml.startElement('book');
xml.startElement('name');
xml.writeAttribute('value','node_xml');
xml.endElement();
xml.startElement('publish');
xml.writeAttribute('value','web');
xml.endElement();
xml.startElement('author');
xml.writeAttribute('value','lig');
xml.endElement();
xml.startElement('author');
xml.writeAttribute('value','bee');
xml.endElement();
xml.endElement();
xml.endDocument();
var dom = xml.toString();
console.log(dom);
xml_reader.read(dom,function(err,res){
if(!err){
console.log('succ');
console.log(res);
console.log();
console.log(res.book.publish.attributes().value);
for(var i=0; i<res.book.author.count(); i++){
console.log(res.book.author.at(i).attributes().value);
}
res.book.author.each(function(index,note){
console.log(note.attributes().value);
})
}
})
对XML的操作方式还有许多,我只是列举了常用的方法,其它的方法还有如PHP的XML Parser,相应的Node.js npm包是sax