我有一段看起来像这样的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>
密钥,则会正确检索文本,但使用下划线魔术密钥可能会出现问题。
这是推荐的方式吗?有没有更干净的方法?
答案 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)
})()