正在将XML解析移动到服务器端

Moving XML parsing to server-side

本文关键字:移动 服务器端 XML      更新时间:2023-09-26

我需要在服务器端解析上传的XML文档。现在我有一些代码可以在客户端工作,但我想把它移到服务器端。我的客户端使用FileReader API,其代码如下:

reader.onload = function (e) {
        var InnerLibrary = new String(e.target.result);
        if (window.DOMParser) {
            parser = new DOMParser();
            xmlDoc = parser.parseFromString(InnerLibrary, "text/xml");
            console.log("start of xmlDoc console log");
            console.log(xmlDoc);
            console.log("end of xmlDoc console log");
            $(xmlDoc).find('book').each(function () {
                console.log("book Found");
                console.log(($(this).attr("year")));
                version = ($(this).attr("year"));
            });

现在,我被引导使用libxmljs来解决其他一些我现在似乎找不到的SO问题。但是这个人说libxmljs会更好,因为这样我就可以使用find()遍历XMLDOM对象,这意味着你不能在xml2js中这样做。

我尝试了libxmljs,但由于某种原因,它给我带来了这个问题中提到的问题:libxmljs在哪里引起问题

所以我想问,我可以在xml2js中使用这种遍历方法吗(我的意思是,使用.find().each().attr(),基本上是这个中使用的所有东西)

如果没有,我应该用什么方法查找数据

UPDATE:我昨天尝试使用xml2js,结果发现它不会将xml文件解析为字符串,它只会将xml从字符串中解析出来。因此,一个额外的问题是:

奖金:我可以在服务器端使用FileReader API吗

由于您使用的是jQuery客户端,因此使用服务器端可能也是最方便的。该端口位于此处,并得到积极维护和使用(每天下载1千次)。请注意,默认情况下安装的是1.8.3版本,但也支持2.0.0以下的版本。这就是您指定要使用的版本的方式:

var jquery = require('jquery');
var $ = jquery(null, '1.8.3');
// or use 2.0.0
var $ = jquery(null, '2.0.0');

我还没有测试xml2js,但由于find()each()attr()都是jQuery函数,您还可以使用该功能来解析DOM,因为您必须安装它才能使用这三个函数。如果你用npm install jquery安装了模块,下面是你的使用方法:

// create an instance of the library
var $ = require('jquery').create();
// use the same way as the browser
$(xml).find('book').each(function () {
  console.log('book found');
  console.log(($(this).attr("year")));
  version = ($(this).attr("year"));
});

节点也没有FileReader API,因为已经存在本机文件系统模块。所有文件I/O都可以使用带有require('fs')fs库执行。

这就是读取文件并将其传递给jQuery进行解析的方法:

var fs = require('fs');
var $ = require('jquery').create();
fs.readFile('/document.xml', function(err, data) {
  if (err) throw err;
  $(data).find('book').each(function () {
    console.log('book found');
    console.log(($(this).attr("year")));
    var version = ($(this).attr("year"));
  });
});

这也可以同步完成:

var fs = require('fs');
var $ = require('jquery').create();
var xml = fs.readFileSync('/document.xml');
$(xml).find('book').each(function () {
  console.log('book found');
  console.log(($(this).attr("year")));
  var version = ($(this).attr("year"));
});

如果不想使用jQuery的Node实现,可以使用较低级别的API,如jsdom和htmlparser,但无论如何都无法使用指定的三个函数。

编辑:在jQuery的Node实现中有一个parseXML(),但它似乎无法正常工作。以下是使用xmldom:的替代解决方案

var fs = require('fs');
var $ = require('jquery').create();
var DOMParser = require('xmldom').DOMParser;
var xml = fs.readFileSync('/document.xml');
var doc = DOMParser.parseFromString(xml, 'text/xml');
$(doc).find('book').each(function () {
  console.log('book found');
  console.log(($(this).attr("year")));
  var version = ($(this).attr("year"));
});

您总是可以在节点中运行一个子进程来运行以下内容:

http://xmlsoft.org/xmllint.html

或者像sudhAnsu63建议的任何其他非节点实现的解决方案。然后处理输出。

您可以使用Cxml在C++中解析xml

http://libxmlplusplus.sourceforge.net/docs/manual/html/ar01s02.html#id2504579

http://www.codeproject.com/Articles/111243/Simple-C-XML-Parser

解析完xml后,可以使用GetRootNode()、GetNextChild()遍历xml文件