我想知道如何使用Javascript线性化或取消缩进XML文本。
这篇文章描述了如何使用Java实现缩进或线性化XML,但我没有看到使用JavaScript的例子。
正如我在你的回答的评论中指出的那样,regex不是一种可靠的方法。更可靠的方法是解析XML,删除所有空白的文本节点,然后重新序列化它:
function parseXml(txt) {
var parser, xmlDoc;
if (window.DOMParser) {
parser = new DOMParser();
xmlDoc = parser.parseFromString(txt, "text/xml");
} else // Internet Explorer
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = false;
xmlDoc.loadXML(txt);
}
return xmlDoc;
}
function serializeXml(node) {
try {
// XMLSerializer exists in certain browsers
var serializer = new XMLSerializer();
return serializer.serializeToString(node);
} catch (e) {
// Internet Explorer has a different approach to serializing XML
return elem.xml;
}
}
function removeWhitespace(node) {
if (node.childNodes && node.childNodes.length) {
Array.prototype.slice.call(node.childNodes).forEach(removeWhitespace);
}
if ((node.nodeType === 3 || node.nodeType === 4) &&
/^[ rnt]*$/.test(node.textContent)) {
node.parentNode.removeChild(node);
}
}
var startXml = '<products>nt<product>ntt<code>1234</code>ntt<name>Widget 3000</name>nt</product>n</products>'
console.log('Before:');
console.log(startXml);
var dom = parseXml(startXml);
removeWhitespace(dom);
var endXml = serializeXml(dom);
console.log('After:');
console.log(endXml);
根据tebs1200的建议,我将正则表达式从Java帖子移植(甚至改进)到Javascript。
在这里:
// This Javascript function is to linearize and return the XML input String
function linearize(xml) {
return (xml!= null) ? xml.trim().replace(/(>|>){1,1}( |t|n|r|s)*(<|<){1,1}/g, "$1$3") : null;
}