XML 到 JSON - 处理 JavaScript 中的 xml 命名空间和别名
XML to JSON - dealing with xml namespaces and alias in JavaScript
我正在尝试使用模块xml2js在node.js中将XML转换为JSON。 访问变量时如何处理命名空间别名?
下面的代码转换我的文件(sampleWithNamespaces.xml)
var fs = require('fs'),
xml2js = require('xml2js');
var parser = new xml2js.Parser();
fs.readFile('sampleWithNamespaces.xml', function (err, data) {
parser.parseString(data, function (err, result) {
console.dir(result);
console.log('Done');
});
});
sampleWithNamespaces.xml :
<d:student xmlns:d='http://www.develop.com/student'>
<d:id>3235329</d:id>
<d:name>Jeff Smith</d:name>
<d:language>JavaScript</d:language>
<d:rating>9.5</d:rating>
</d:student>
输出:
$ node xml2jsTest.js
{ '@': { 'xmlns:d': 'http://www.develop.com/student' },
'd:id': '3235329',
'd:name': 'Jeff Smith',
'd:language': 'JavaScript',
'd:rating': '9.5' }
Done
如果我没有命名空间别名,我可以使用符号result['d:name']
而不是result.name
来访问"name"属性。 我想我的问题是,我这样做的方式是否正确?
我读过"如果一个元素有命名空间别名,别名和元素使用"$"连接起来。例如,ns:element 变为 ns$element" 如果我这样做,我可以将属性读取为 result.d$name
. 如果我走这条路,我该怎么做?
我也有类似的问题。我的大多数 XML 标记都在单个命名空间中。所以我决定从我的 XML 中删除所有命名空间。
在解析 XML 时,可以通过向 xml2js
添加 tagNameProcessor 来去除命名空间。
var parseString = require('xml2js').parseString;
var stripNS = require('xml2js').processors.stripPrefix;
parseString(xml_str, { tagNameProcessors: [stripNS] },function(err, result) {});
从技术上讲,这将忽略所有命名空间。如果您有来自多个命名空间的 XML 标记,那么这可能没有多大用处。
对于那些使用打字稿的人
- 添加此导入语句(您将需要 npm install -D @types/xml2js)
import { Parser, processors } from 'xml2js';
- 创建新解析器时添加标记名称处理器选项
const parser = new Parser(
{
trim: true,
explicitArray: false,
tagNameProcessors: [processors.stripPrefix]
});
parser.parseString(xmlData, function(err, result)
{
如果使用 node 和 xml2js 使用 result["ns:entry"]
来引用特定条目
你引用的文档与xml2js无关,但如果你愿意,你可以得到相同的模式。你必须更改 xml2js 的源代码或在加载后循环重命名所有内容,这两者都不是好主意(第一个意味着你将无法如此轻松地更新,并且都会增加代码的开销),所以你可能应该坚持使用 ['d:name'] 语法。唯一的缺点是它为每个查找添加 3 个字符,但是如果您的服务器使用 gzip,则在现实世界中不会产生影响。
如果你真的愿意,这个函数会重命名所有内容:
function colonToDollar(obj){
var r={};
for(var k in obj){
r[k.replace(/:/g,'$')] = (typeof obj[k]==='object') ? colonToDollar(obj[k]) : obj[k];
}
return r;
}
- 在javascript中使用命名空间
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- javascript中的命名空间,IDE中支持代码完成/内容辅助's
- 如何使用javascript命名空间
- js命名空间和变量范围
- html,js-如何限制元素"范围“-命名空间
- 转换自的JavaScript命名空间
- 命名空间与自调用函数
- 什么's当前命名空间/类中JavaScript子命名空间/类的语法
- 无法加载Ace.js编辑器模式和主题(命名空间项目&AMD require.js&grunt
- jQuery命名空间和使用“;这个“;
- 为什么使用自定义标记创建元素会在 IE9 或 10 的 outerHTML 中添加 xml 命名空间,直到调用 .fin
- 使用 JavaScript 和 jQuery 修改命名空间 XML
- XML 到 JSON - 处理 JavaScript 中的 xml 命名空间和别名
- 为什么 AngularJS 不建议使用 XML 命名空间
- 如何在 JavaScript 中获取 XML 命名空间
- 使用 JavaScript 将 SOAP/XML 命名空间提取为键/值对列表
- 正在分析命名空间为的XML JQuery Ajax响应
- XML节点:添加具有命名空间的属性
- 如何在JavaScript + Marklogic中声明xml命名空间