【问题标题】:XML to JSON - dealing with xml namespaces and alias in JavaScriptXML to JSON - 处理 JavaScript 中的 xml 命名空间和别名
【发布时间】:2012-07-01 05:28:48
【问题描述】:

我正在尝试使用模块 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 来访问“名称”属性。我想我的问题是,我这样做是否正确?

read 说“如果一个元素具有命名空间别名,则别名和元素使用“$”连接。例如,ns:element 变为 ns$element”如果我这样做,我可以读取属性作为result.d$name。如果我走这条路,我怎么会这样做?

【问题讨论】:

    标签: javascript json node.js xml-parsing xml-namespaces


    【解决方案1】:

    您引用的文档与 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;
    }
    

    【讨论】:

      【解决方案2】:

      如果您使用 node 和 xml2js,请使用 result["ns:entry"] 来引用特定条目

      【讨论】:

        【解决方案3】:

        我遇到了类似的问题。我的大部分 XML 标记都在一个命名空间中。所以我决定从我的 XML 中去掉所有的命名空间。

        在解析 XML 时,可以通过将 tagNameProcessors 添加到 xml2js 来去除命名空间。

        var parseString = require('xml2js').parseString;
        var stripNS = require('xml2js').processors.stripPrefix;
        
        parseString(xml_str, { tagNameProcessors: [stripNS] },function(err, result) {});
        

        从技术上讲,这将忽略所有命名空间。如果您有来自多个命名空间的 XML 标记,那么这可能没什么用处。

        【讨论】:

        • 这个处理大文件。
        【解决方案4】:

        对于那些使用打字稿的人

        • 添加此导入语句(您将需要 npm install -D @types/xml2js)
        import { Parser, processors } from 'xml2js';
        
        • 创建新解析器时添加 tagNameProcessor 选项
            const parser = new Parser(
                {  
                    trim: true,  
                    explicitArray: false,
                    tagNameProcessors: [processors.stripPrefix]
                });
                parser.parseString(xmlData, function(err, result)
                { 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-11
          • 1970-01-01
          • 2011-09-05
          • 2011-07-07
          • 2014-05-31
          • 1970-01-01
          • 2011-05-14
          • 2020-04-06
          相关资源
          最近更新 更多