【问题标题】:Moving XML parsing to server-side将 XML 解析移至服务器端
【发布时间】:2013-09-03 14:24:14
【问题描述】:

我需要在服务器端解析上传的 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 causes problems

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

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

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

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

【问题讨论】:

  • 您提到的问题是 Windows Azure 无法构建本地模块,您使用的是哪个平台。
  • 关于 xml2js 的问题不在于 Windows Azure。这是使用 libxmljs 时的问题。您可以将 xml2js 作为节点模块引入项目文件结构中,并像其他任何 Windows azure 节点模块一样上传它。

标签: javascript xml node.js xml-parsing


【解决方案1】:

由于您使用的是 jQuery 客户端,因此使用服务器端可能对您来说最方便。该端口位于here,并且得到积极维护和使用(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 也没有FileReader API,因为已经有一个本地文件系统模块。所有文件 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"));
});

【讨论】:

  • 哇,这太棒了!干得好,你回答了我的每一个问题。如果我能给你更多的代表,我会的。我会尽快使用您的建议。
  • 将 XML 字符串传递给 $() 会尝试将其解析为 HTML 而不是 XML,并且可能会产生不良结果。在 jQuery 中使用的正确方法是 $.parseXML()
  • 我注意到 Node 实现中没有$.parseXML(),这就是我这样回答的原因,但我会进一步看看是否漏掉了什么。
  • 我添加了一个使用DOMParser的节点实现的解决方案。
【解决方案2】:

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

http://xmlsoft.org/xmllint.html

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 很高兴知道,但我正在寻找一个 javascript 解析器。
    • 仅供参考 javascript 是一种客户端脚本语言。
    • 那么 sax-js(xml2js 的设计用途)是如何为 node.js(javascript 服务器端应用程序)制作的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多