除了使用下划线键之外,如何使用xml2js访问XML元素文本?

时间:2016-04-19 15:06:19

标签: javascript xml node.js xml-parsing

我有一段看起来像这样的XML:

<errorMessage>
    <payload encoding="plain">The error message</payload>
</errorMessage>

我使用xml2js解析器:

var parser = new xml2js.Parser({
    explicitCharKey: false,
    trim: true,
    explicitRoot: true,
    mergeAttrs: true
});
parser.parseString(myString, function(err, result) {
    var payload = result.errorMessage.payload;
    // how do I access the error message text?
    var errorMessage = payload[0]['_'];
});

我需要访问The error message元素中的payload字符串。如果我在包含_的节点上使用<payload>密钥,则会正确检索文本,但使用下划线魔术密钥可能会出现问题。

这是推荐的方式吗?有没有更干净的方法?

3 个答案:

答案 0 :(得分:0)

xml2js options文档说明了这一点:

attrkey (default: $): Prefix that is used to access the attributes.
charkey (default: _): Prefix that is used to access the character content.

因此element._看起来像是element的文本内容。如果您想将此密钥命名为_以外的其他内容(例如textContent),则可以按以下方式更改:

parseString(xml,  {charkey: 'textContent'}, function(err, result) {
   // result.element.textContent will hold the text value of result.element
});

但是,我还没有找到一种方法可以从_键获取文本内容始终。例如,这个:

xml2js.parseString(
    '<element>1.23</element>', // <-- notice that this has no attributes
    function(err, result) {      
        console.log(JSON.stringify(result));
    }
);

输出:

{"element":"1.23"}

但是,如果您更改XML以添加属性,例如<element attr="value">1.23</element>,则可以得到:

{"element":{"_":"1.23","$":{"attr":"value"}}}

我需要解析有时具有属性但有时没有属性的XML输出。可能有更好的方法,但是当我需要元素中的文本时,我只需调用getText(element),其中getText为:

var getText = function(elt) {
    if (typeof(elt) === 'string') return elt;
    if (typeof(elt) === 'object' && elt.hasOwnProperty('_')) return elt._;
    return ''; // or whatever makes sense for your case
}

答案 1 :(得分:0)

如果您解析带有属性的XML文档,则在JSON结果中会得到有趣的下划线。就是这样。如果您真的讨厌它并且不想在文档中使用任何属性,请在选项栏中设置ignoreAttrs : true。然后,您将直接从元素的属性访问元素文本。

答案 2 :(得分:0)

您可以做到

const { transform } = require('camaro')

;(async function() {
    const xml = `
        <errorMessage>
            <payload encoding="plain">The error message</payload>
        </errorMessage>
    `
    const { errorMessage } = await transform(xml, {
        errorMessage: 'errorMessage/payload'
    })

    console.log(errorMessage)
})()