从 node.js 访问 xml 内容

Posted

技术标签:

【中文标题】从 node.js 访问 xml 内容【英文标题】:accesing xml content from node.js 【发布时间】:2016-01-10 05:27:51 【问题描述】:

我在 MarkLogic 数据库中有一堆 XML 文档。 我正在研究 node.js 中间层,它需要将某个集合中所有 xml 文档的某些属性传递到 JSON 数组中。

到目前为止,我有这个:

var marklogic = require('marklogic');
var my = require('./my-connection.js');

var db = marklogic.createDatabaseClient(my.connInfo);
var qb = marklogic.queryBuilder;

db.documents.query(
  qb.where(qb.collection("alert"))
).result( function(documents) 
    console.log('The alerts collection:')
    documents.forEach( function(document) 
      //console.log('\nURI: ' + document.uri);
      var aObj = document.content
      //var alert = aObj.getElementsByTagNameNS("http://example.com/sccs/alert","alert");
      console.log('Alert: ' + document.content);
    );
, function(error) 
    console.log(JSON.stringify(error, null, 2));
); 

这让我恢复了内容。

示例结果:

Alert: <?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0"?>
<obj:object xmlns:obj="http://marklogic.com/solutions/obi/object">
  <obi:metadata xmlns:obi="http://marklogic.com/solutions/obi" createdBy="admin" createdDateTime="2015-09-23T20:42:48.562829Z" lastUpdatedBy="admin" lastUpdatedDateTime="2015-09-23T20:42:48.562829Z"/>
  <obj:label>Active</obj:label>
  <obj:type>alert</obj:type>
  <obj:id>41e718eb-a2e2-49e0-939a-68bb87c1e301</obj:id>
  <obj:content>
    <alert xmlns="http://example.com/sccs/alert">
      <obj:property sourceCount="1">
        <status>Active</status>
      </obj:property>
      <obj:property sourceCount="1">
        <position>"type":"Point", "coordinates":[52.2, 4.3]</position>
      </obj:property>
      <obj:property sourceCount="1">
        <scc:id xmlns:scc="http://example.com/sccs">2a65b4cc-acee-4675-a8ba-d8c5dfaac9dd</scc:id>
      </obj:property>
    </alert>
  </obj:content>
  <obj:workspaces>
    <obj:workspace id="Public"/>
  </obj:workspaces>
  <obj:sourceIds count="1">
    <source:id xmlns:source="http://marklogic.com/solutions/obi/source">42aebdc7-41aa-4695-b514-2bb63f85d47c</source:id>
  </obj:sourceIds>
</obj:object>

问题:

例如,我想访问此内容中的“obj:content”元素。

在查询控制台中,我可以这样做:

var alerts = fn.collection("alert").toArray();
var aXML = alerts[2].getElementsByTagNameNS("http://example.com/sccs/alert","alert");

如何从 node.js 执行此操作?

(我不明白node.js中查询返回的对象类型)

【问题讨论】:

【参考方案1】:

MarkLogic node.js API 以字符串形式返回 XML 文档;您需要使用 XML 解析器来查询、投影或处理该 XML。在 npm 上有很多用于与 XML 交互的模块,请参阅

The best node module for XML parsing https://www.npmjs.com/search?q=xml

您可能会发现使用带有 MarkLogic 的服务器端转换更容易,并首先将您的 XML 文档转换为 JSON:http://docs.marklogic.com/guide/node-dev/extensions#id_78179

【讨论】:

服务器端转换+1。构建一个转换来识别您需要的信息并以 JSON 形式返回,而不是转换整个文档。 我也会 +1。 OBI 有一些将对象 XML 转换为 JSON 的默认转换,但您可能会想要编写自己的代码来执行 Dave 所说的操作 - 仅返回您想要的数据,并且以您的客户最容易使用的格式返回。 是的,我最终使用了服务器端转换

以上是关于从 node.js 访问 xml 内容的主要内容,如果未能解决你的问题,请参考以下文章

什么 TypeScript 配置产生最接近 Node.js 14 功能的输出?

带你从零学Node.js

node.js 1

Node.js Buffer(缓冲区)

nvm npm node.js的关系

Node.js 的设计错误