Node之XML

1 篇文章 0 订阅

在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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值