【问题标题】:Read untagged text from XML (or HTML)从 XML(或 HTML)读取未标记的文本
【发布时间】:2022-01-23 23:38:49
【问题描述】:
我有一个包含许多这样的条目的 XML 文件:
<query id='LoadRights'>
<description>Load all user-rights</description>
SELECT CODE FROM RIGHTS
</query>
使用 id,我只想读取未标记的行“SELECT CODE FROM RIGHTS”。有没有使用 jQuery 的优雅方法?
我在 Nodejs 应用程序中使用 Cheerio,但它基于 jQuery。提前致谢
【问题讨论】:
标签:
jquery
node.js
xml
cheerio
【解决方案1】:
您可以为此使用 camaro。请注意,我在这里使用normalize-space(),因为我想修剪文本前后的换行符。如果您想要原始文本,请将其删除。
const { transform } = require('camaro')
async function main() {
const xml = `
<query id='LoadRights'>
<description>Load all user-rights</description>
SELECT CODE FROM RIGHTS
</query>`
template = {
text: 'normalize-space(query/text())'
}
const output = await transform(xml, template)
console.log(output);
}
main()
输出
{ text: 'SELECT CODE FROM RIGHTS' }
如果您有多个查询,它将如下所示
const { transform } = require('camaro')
async function main() {
const xml = `
<queries>
<query id='LoadRights'>
<description>Load all user-rights</description>
SELECT CODE FROM RIGHTS
</query>
<query id='LoadRights'>
<description>Load all user-rights</description>
SELECT CODE FROM RIGHTS 2
</query>
<query id='LoadRights'>
<description>Load all user-rights</description>
SELECT CODE FROM RIGHTS 3
</query>
</queries>`
template = {
queries: ['queries/query', 'normalize-space(text())']
}
const output = await transform(xml, template)
console.log(output);
}
main()
输出将是
{
queries: [
'SELECT CODE FROM RIGHTS',
'SELECT CODE FROM RIGHTS 2',
'SELECT CODE FROM RIGHTS 3'
]
}
【解决方案2】:
这是一种方法,基本上是使用隐藏的实用程序 html 元素和一些 jquery 方法来清除任何“标记”的内容
const getText = el => {
$('#copy').html($(`${el}`).html());
$('#copy *').each(function() {
$(this).text('')
})
return $('#copy').text().trim()
};
console.log(getText('#LoadRights'))
#copy {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<query id='LoadRights'>
<description>Load all user-rights</description>
SELECT CODE FROM RIGHTS
</query>
<div id="copy"></div>