4

我需要在服务器端解析上传的 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()遍历XML DOM对象,这暗示你不能在xml2js中这样做。

我尝试了 libxmljs,但由于某种原因,它导致了我在此问题中指出的问题: The question where libxmljs cause questions

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

如果不是,我应该用什么方法来查找数据?

更新:我昨天尝试使用 xml2js,结果它不会从 xml 文件解析为字符串,它只会从字符串中解析 xml。所以一个额外的问题是:

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

4

3 回答 3

3

由于您使用的是 jQuery 客户端,因此使用服务器端可能最方便。该端口位于此处,并且得到积极维护和使用(每天下载 1k 次)。请注意,默认情况下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"));
});

Node 也没有FileReaderAPI,因为已经有一个本地文件系统模块。所有文件 I/O 都可以使用fs带有require('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,例如jsdomhtmlparser,但无论如何您都无法使用您指定的三个函数。

编辑:在 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"));
});
于 2013-09-07T22:06:50.910 回答
0

您始终可以在节点中运行子进程来运行以下内容:

http://xmlsoft.org/xmllint.html

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

于 2013-09-07T16:23:35.247 回答
-2

您可以使用 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 文件

于 2013-09-06T06:13:55.020 回答