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"));
            });

今、私は今見つけられないように見える他のSOの質問ごとにlibxmljsを使用するように導かれました。しかし、その人は libxmljs の方が優れていると言っていました。なぜなら、find() を使用して XML DOM オブジェクトをトラバースできるからです

私はlibxmljsを試しましたが、何らかの理由でこの質問に記載されている問題を引き起こしています: libxmljsが問題を引き起こす質問

xml2js でこのトラバーサル メソッドを使用できますか? (つまり、.find() .each() .attr() を使用して、基本的にこれで使用されるすべてのもの)

そうでない場合、どのような方法でデータを検索すればよいですか?

更新:昨日xml2jsを使用してみましたが、xmlファイルから文字列に解析されず、文字列からxmlを解析するだけであることがわかりました。したがって、おまけの質問は次のようになります。

おまけ: サーバー側で FileReader API を使用できますか?

4

3 に答える 3

3

jQuery クライアント側を使用しているので、サーバー側も使用するのがおそらく最も便利です。ポートはここにあり、積極的に保守および使用されています (1 日あたり 1,000 件のダウンロード)。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 関数であるため、これら 3 つの関数を使用するにはインストールする必要があるため、この機能を使用して 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 はありません。fsすべてのファイル I/O は、ライブラリを使用して実行できます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 実装を使用したくない場合は、jsdomhtmlparserなどの下位レベルの APIを使用できますが、指定した 3 つの関数を使用することはできません。

編集: 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

C++でxmlを解析するためにCxmlを使用できます

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 に答える